PKU 3093 Margaritas on the River Walk
先對輸入的數組排序,然后類似于01對a[i]做決策,核心代碼加了注釋:
for (i=1; i<=n; i++) {
for (j=1; j<=maxsum; j++) {
if (j >= sum[i]) d[i][j] = 1; //j比sum[i]大,肯定這時候d[i][j]=1;
else {
d[i][j] = d[i-1][j];//不考慮a[i]
if (j-a[i]>=0) {//考慮a[i]
if (d[i-1][j-a[i]] > 0) d[i][j] += d[i-1][j-a[i]];//把a[i]加進以前的選擇里面
else d[i][j]++;//a[i]單獨作為一個選擇(這里需要先對a[i]排序,消除后效性)
}
}
}
}
PKU 1037 A decorative fence
先dp算出以i為起點的序列的個數,再組合數學
td[n][i]和tu[n][i]分別表示個數為n,以i開始的上升和下降的序列個數
易知:
td[n][1] = 0;
td[n][i] = sigma(tu[n-1][j], j從1..i-1) = td[n][i-1] + tu[n-1][i-1] ;
tu[n][i] = td[n][n+i-1];
PKU 2677 Tour
雙調歐幾里德旅行商問題(明顯階段dp)
動態規劃方程 :d[i+1][i] = mint(d[i+1][i], d[i][j]+g[j][i+1]);
d[i+1][j] = mint(d[i+1][j], d[i][j]+g[i][i+1]);
0<=j<i
PKU 2288 Islands and Bridges
集合DP
狀態表示: d[i][j][k] (i為13為二進制表示點的狀態, j為當前節點, k為到達j的前驅節點)