參考** blog.csdn.net/sdfzyhx/article/details/52832832
第一步是要確定狀態,dp[i]表示前i個縮成一堆的情況下先手的最大值。dp[i]表示前i個縮成一堆很好想,關鍵是表示什麼的值。題目要求求先手的最大值,因此表示此值十分合理。然後是狀態轉移,自己做的時候不知道該怎麼處理兩個人,因為乙個人的最優解得根據另乙個人的最優解才能求出,所以我就想儲存兩個人的最優解。事實上無論哪個人,面對同乙個狀態,他的最優決策都是不變的,所以不需要儲存兩個人,只需要儲存最優決策即可。顯然我們想得到dp[1],而dp[n-1]又是顯然的,因為根據題目要求,這種情況下必須要選至少2個,而又只剩2個了。因此要用逆推。狀態轉移方程是dp[i]=max(sum[j]-dp[j])i+1<=j<=n。
在面對乙個狀態時,你的決策只能是取2~n-i個,便利一遍,尋乙個最大值即可。值為你的和減去對面的最優解。
注意下,對於dp[i],如何到達這種狀態不重要,重要的是現在該怎麼做。遞推著遞推著你就到初始狀態了。
可以優化,在dp時順便記錄sum[j]-dp[j]的最大值即可。
**
#include#define maxn 200010
using namespace std;
typedef long long ll;
ll a[maxn];
ll sum[maxn];
ll dp[maxn];
int main()
ll max=sum[n];
for(ll i=n-1;i;i--)
printf("%i64d\n",dp[1]);
return 0;
}
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
《動態規劃》 ACM 動態規劃例題詳解
描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...