演算法導論-15-2-整齊列印

來源:互聯網
上載者:User

題目:

思考:

定義

(1)extra為行末多餘空白字元個數的立方和

(2)f[i,j] = M - j + i - SUM(lk) , i<=k<=j

(3)令len[i,j]表示第i個單詞到第j個單詞可以得到的最小extra

整齊列印問題可以分解成以下子問題

(1)若f[i,j] < 0,,則len[i,j] = MIN(len[i,k] + len[k+1,j]) , i<=k<j

(2)若f[i,j] > 0 && j==n,則len[i,j] = 0

(3)若i==j,則len[i,j] = (f[i,j])^3

代碼:為了編程方便,程式和說明略有不同

#include <iostream>#include <cmath>using namespace std;#define M 10//一行的最大長度#define N 10//單詞的個數int s[N][N];void DP(int *len){int i, j, k, step, temp;for(step = 0; step < N; step++){for(i = 0; i < N; i++){temp = 0;j = i + step;if(j >= N)break;//計算len[i,j]for(k = i; k <= j; k++){if(k != i) temp++;temp = temp + len[k];if(temp > M)break;}if(temp > M)s[i][j] = 0x7fffffff;//若f[i,j] > 0 && j==n,則len[i,j] = 0else if(j == N-1)s[i][j] = 0;//若i==j,則len[i,j] = (f[i,j])^3else s[i][j] = pow(M*1.0-temp,3);//若f[i,j] < 0,,則len[i,j] = MIN(len[i,k] + len[k+1,j]) , i<=k<jfor(k = i; k < j; k++)if(s[i][k]+s[k+1][j] < s[i][j])s[i][j] = s[i][k]+s[k+1][j];}}cout<<s[0][N-1]<<endl;}void Print(){int i, j;for(i = 0; i < N; i++){for(j = 0; j < N; j++)cout<<s[i][j]<<' ';cout<<endl;}}/*1 2 3 1 2 3 1 2 3 1*/int main(){int len[N], i;//輸出資料for(i = 0; i < N; i++)cin>>len[i];DP(len);//Print();return 0;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.