題意:
給你一串數字,頭尾不能動,每次取出乙個數字,這個數字貢獻=該數字與左右相鄰數字的乘積,求乙個最小值。
思路:
用dp[s][t]去代表s到t的最小值,包括a[s]和a[t],然後從區間為3開始列舉,對每個小區間列舉乙個取出的數,狀態轉移方程就是:dp[s][t]=min(dp[s][k]+dp[k][j]+a[i]*a[k]*a[j];
ps:
操蛋的區間dp…想了半個小時毛都沒想出來。看了自己的思路,是沒有去重視這個取的問題,狀態的改變就是取的之後,應該從這裡一直去思考,對於子結構的觀念也不強,怎麼說啊,子結構就是乙個前一狀態,其實就是對於dp[i][j]陣列的定義感不強,所以對於轉化也不可能有多大的進展。說了那麼多,解題最應該的就是這個對於某個位置的取一直要去思考,然後就會想到列舉每個位置了。臥槽,好弱啊,就是這麼弱啊,其實沒聽到區間dp,也會寫啊,也不知道為毛這都想不到,看重dp了吧,,,不知道怎麼說了,媽的。
貼一發大哥給我的**挫**code…
#include
#include
#include
#define min(a, b) a < b ? a : b
int a[200];
int dp[200][200];
int main()}}
printf("%d\n", dp[1][n]);
return
0;}
poj 1141 區間dp 列印路徑
題意 定義合法的括號序列如下 1 空序列是乙個合法的序列 2 如果s是合法的序列,則 s 和 s 也是合法的序列 3 如果a和b是合法的序列,則ab也是合法的序列 例如 下面的都是合法的括號序列 下面的都是非法的括號序列 給定乙個由 和 組成的序列,找出以該序列為子串行的最短合法序列。解題思路 這題...
poj 1141(區間dp 滾動陣列)
題意 有m個人,我們任選3個人組成乙個隊伍,可以組成c m,3 種隊伍,給出這些隊伍之間的勝率。現在,需要你戰勝n個隊伍。戰勝該隊伍,你可選擇用戰勝的隊伍來替換你現有的隊伍。現在要求戰勝這n個隊伍的最大概率。思路 因為對於戰勝的隊伍,我們可以選擇替換還是不替換,這就像01揹包。因為n非常大,我們需要...
hdoj5115 區間DP 基礎
題意 有n頭wolf排成一排,殺一頭wolf回受到受到的傷害 它的本身a i 相鄰兩個b i 1 b i 1 然後殺死第k個位置的wolf的話,k 1和k 1預設相鄰 滿足的話 思路 用雨巨的話說 完全orz 這不就變成區間dp水題了麼 dp i j 表示從第i頭狼到第j頭狼全部被殺死所受到的最小傷...