用dp[i][j]表示將flower i放在vase j中「這個狀態「所能達到的最大美感值,假設flower i放入各個vase中的美感值分別為fv[1]...fv[v],則
for cur = i : v
dp[i][cur] = -inf;
for pre = i-1 : cur-1
dp[i][cur] = max(dp[i-1][pre] + fv[cur], dp[i][cur]);
觀察狀態轉換方程可以看出,我們完全可以邊輸入邊dp省去fv陣列的開銷:
#include #define ninf -9999
inline short max(short a, short b)
short f, v;
short dp[101][101] = ;//dp[i][j] stands for flower i put shorto vase j
//thus first i-1 flowers been put shorto first j-1 vases
int main()}}
//print result
beauty = ninf;
for(i = f; i <= v; ++i) beauty = max(beauty, dp[f][i]);
printf("%d\n", beauty);
}return 0;
}
時間0ms,空間168kb,到這裡本應該已經結束了,可是回頭再想一想滾動陣列,由於dp[i][j]僅與dp[i-1][i-1]~dp[i-1][j-1]有關,儲存fv後,利用逆向遞推的滾動陣列,我們實際上可以將兩維的dp變為一維的dp,一下就節省了100*101*2bytes的空間,**如下:
#include #define ninf -9999
inline short max(short a, short b)
short f, v;
short fv[101];
short dp[101];
int main()}}
//print result
beauty = ninf;
for(i = f; i <= v; ++i) beauty = max(beauty, dp[i]);
printf("%d\n", beauty);
}return 0;
}
正如預期,空間減少了20k,不過出乎意料的是時間卻變成了16ms,看來oj的測試時間有時候也看rp呢,呵呵 POJ1157 動態規劃
由於花有擺放順序的限制,即後一種花只能放在前一種花所放的花盆的後面的花盆,所以動態規劃的狀態轉移就比較容易寫出來了。狀態dp i j 表示的是前i種花放入前j個花盆中時的最大權值。則dp i j max。如下 include includeusing namespace std int dp 101...
DP之數塔模型poj1157
題目 poj1157little shop of flowers 題意 假設以最美觀的方式布置花店的櫥窗,有 f 束花,每束花的品種都不一樣,同時,至少有同樣數量的花瓶,被按順序擺成一行,花瓶的位置是固定的,並從左到右,從 1 到 v 順序編號,v 是花瓶的數目,編號為 1 的花瓶在最左邊,編號為 ...
vue 實現輸入框邊輸入邊驗證
這個方法是保留整數 inputchange e if o.value.tostring split 0 length 8 else 這個就是最後過來之後的值 this.value o.value 這個方法保留兩位小數 inputchange e obj.value obj.value.replace...