靈活的dp啊。。靈活的思路啊。。怎樣去分析乙個你認為是用簡單dp解決的問題呢。。就是把問題盡量想得簡單一點。
舉個例子,把大象放進冰箱分為幾步——把大象的頭放進冰箱,把大象的尾巴放進冰箱。都是同樣的「放進冰箱」的操作,涉及的資料的規模變小了,這樣「步驟簡化」就可以有點思路。
回到說這道題 ,你合併這11堆石子,你想想其實也就兩步——最後把兩堆石子合併成一堆,結束。那麼這兩堆石子,也就是這兩組「子規模」資料怎樣確定呢?這就想到了該dp的狀態轉移方程:
dp[i][j]=min(dp[i][k]+dp[k+1][j])+sum[i][j]; //k是i到j之間的數,sum[i][j]是第i堆到第j堆的重量之和
我的ac**:
#include#includeusing namespace std;
int sum[12][12];
int dp[12][12];
int b[12];
int main()
} for(int i=11;i>=1;i--) //這裡要特別注意要逆序!
dp[i][j]=minn+sum[i][j];
} }cout對於注釋那裡,i必須逆序,因為思路是這樣的:
那麼你在求dp[i][j]的時候要用到dp[k+1][j]和dp[i][k],所以仔細想想會發現,i需要逆序,j需要正序。
DP 合併石子
矩陣連乘求最小相乘次數的問題和石子合併的問題思路是一樣的,而二者都是典型的dp 石子合併的問題 問題描述 在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆的中間位置,合併的費用為兩堆石子的總數。求把所有石子合併成一堆的最小花費。輸入格式 輸入第一行包含乙個整數n...
合併石子 dp
時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 7 提交 狀態 討論版 命題人 quanxing 在乙個操場上一排地擺放著 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。計算出將 堆石子合併成一堆的最小得分。第...
石子合併 DP
題目 在乙個操場上一排地擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請設計乙個程式,計算出將n堆石子合併成一堆的最小得分。輸入每組資料第1行為乙個正整數n 2 n 100 以下n行,每行乙個正整數,小於10000,分...