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...