題意:
n個單詞,每行字元數量m個,單行字元數量值為j時,花費我 (m-j)^3
單詞間有乙個空格,問最小花費。 最後一行不花費
解法dp[i][j] 表示前i個單詞,長度為j的最小花費
// 最後一行多餘空格不作為計算,只有出現換行時才計算。
// dp[i][j] 表示前i個單詞,長度為j的最小整齊度
// 由 dp[i][j] 通過新增乙個 單詞 l[i+1] 只可能導致兩種情況
// 1, 依然在一行,此時應滿足條件
// 若 j == 0 ,則此時必定可以新增到後面有
// dp[i+1][ l[i+1] ] = min
// 若 j > 0 , 則此時需滿足 j+1+l[i+1] 有
// dp[i=1][ j+1+l[i+1] ] = min
// 2, 若換行,此時應滿足條件 j > 0
// dp[i+1][ l[i+1] ] = min
view code
#include#include#include
#include
using
namespace
std;
#define cmp(x) (x)*(x)*(x)typedef unsigned
long
long
ll;const ll inf = ~0u>>1;//
最後一行多餘空格不作為計算,只有出現換行時才計算。
//dp[i][j] 表示前i個單詞,長度為j的最小整齊度
//由 dp[i][j] 通過新增乙個 單詞 l[i+1] 只可能導致兩種情況
//1, 依然在一行,此時應滿足條件
//若 j == 0 ,則此時必定可以新增到後面有
//dp[i+1][ l[i+1] ] = min
//若 j > 0 , 則此時需滿足 j+1+l[i+1] 有
//dp[i=1][ j+1+l[i+1] ] = min
//2, 若換行,此時應滿足條件 j > 0
//dp[i+1][ l[i+1] ] = min
ll dp[2][510
];int l[2010
];int
n, m;
void
dp()
else
if( j+1+l[i+1] <=m )
} if( j > 0
) }
}
} ll ans =inf;
for(int i = 0; i < m; i++)
}printf(
"%llu\n
", ans );
}int
main()
return
0;
}
vijos1476 旅遊規劃 動態規劃
傳送門 題解 我是這麼做的,首先第一遍求出每個點向下的不相交的最長鏈和次長鏈,這樣兩條鏈拼起來就是就是過這個點 不包含他的父親的情況下 的最長鏈。在這些最長鏈中取max就可以得到直徑。然後乙個點在直徑上,要麼他本身就在已經求出的最長鏈上 就是從這個點出發的最長 次長鏈 直徑長度 要麼如果這個點在某一...
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...