POJ 1157 邊輸入邊DP 滾動陣列

2021-06-22 13:40:47 字數 1293 閱讀 1772

用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...