hrb 1476 動態規劃

2022-05-13 20:49:35 字數 1450 閱讀 6912

題意:

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