第3章 動態規劃,演算法分析題3 3 漂亮列印

2021-06-13 23:13:16 字數 1989 閱讀 7900

n代表單詞的數目;

mlen

代表一行可以列印的最大長度;

m[i]

表示:以第

i個單詞作為列印的第乙個單詞時,列印的最小『醜陋』值為

m[i];

len()

函式返回改行列印第

i個數到第

j個數時的所佔長度;

ugly()

函式根據改行列印的長度返回『醜陋』值。

注:題目中要求的最漂亮的列印方案,所以『醜陋』值越小,越漂亮。

動態規劃法:

#include #include using namespace std;

#define maxn 100

#define inf 0x7fffffff

int wl[maxn]; //wl[i]表示:第i個單詞的長度

int m[maxn]; //m[i]表示:從第i個單詞開始列印所得的最小'醜陋'值

int tail[maxn]; //tail[i]表示:從第i個單詞開始列印取得最小'醜陋'值時,第一行最後乙個單詞的標號

int uglyvalue(int len, int maxlen)

int prettyprint(int n, int maxlen)

//計算'醜陋'值

int value = 0;

if (j != n) //j==n時,第一行就是最後一行,所以'醜陋'值為0

//printf("i: %d j: %d value: %d\n", i, j, value);

if (value < m[i])

}} return m[1];

}int main(void)

printf("%d\n", prettyprint(n, maxlen));

for (i = tail[1]; i != n; i = tail[i+1])

printf("%d\n", n);

} return 0;

}

備忘錄法:

#include #include using namespace std;

#define maxn 100

#define inf 0x7fffffff

int n;

int wl[maxn];

int mem[maxn];

int tail[maxn];

int maxlen;

int uglyvalue(int len)

int prettyprint(int k, int lineid)

int value = 0;

if (i != n)

value = (mem[i+1] + uglyvalue(len));

} if (value < minvalue)

}//printf("k: %d minvalue: %d\n", k, minvalue);

return minvalue;

}int main(void)

memset(mem, -1, sizeof(mem));

printf("%d\n", prettyprint(1, 1));

for (i = tail[1]; i != n; i = tail[i+1])

printf("%d\n", n);

} return 0;

}

測試資料:

5 11

3 4 2 7 4

5 11

3 4 2 7 3

5 10

3 4 2 7 4

10 15

3 9 4 7 2 3 4 1 8 5

演算法 動態規劃 演算法題

dp 動態規劃,dynamic programming 將乙個問題拆成幾個子問題,分別求解這些子問題,即可推斷出大問題的解。概念 無後效性。嚴格定義 如果給定某一階段的狀態,則在這一階段以後過程的發展不受這階段以前各段狀態的影響。最優子結構。大問題的最優解可以由小問題的最優解推出,這個性質叫做 最優...

動態規劃(演算法導論第15章)

動態規劃 dynamic programming 與分治方法相似,都是通過組合子問題的解來求解原問題。其中,分治方法將問題劃分為互不相交的子問題,遞迴的求解子問題,再將它們的解組合起來,求出原問題的解。與之相反,動態規劃應用於子問題重疊的情況,即不同的子問題具有公共的子子問題 子問題的求解是遞迴進行...

演算法實驗3《動態規劃演算法實驗》

1.編寫乙個簡單的程式,解決0 1揹包問題。設n 5,c 10,w v include using namespace std void knapsack int v,int w,int c,int n,int m m 1 c m 2 c if c w 1 m 1 c m 1 c m 2 c w 1...