1. 程式人生 > 實用技巧 >P3146 [USACO16OPEN]248 G 區間DP 暴力DP

P3146 [USACO16OPEN]248 G 區間DP 暴力DP

給定一個1*n的地圖,在裡面玩2048,每次可以合併相鄰兩個(數值範圍1-40),問最大能合出多少。注意合併後的數值並非加倍而是+1,例如2與2合併後的數值為3。

1.首先合併聯想到區間,因此此題就是石子合併的變種

2.石子合併的條件是相鄰,此題的條件是相鄰且相等。注意是能“合併“出多少。

於是狀態設定為 dp【i】【j】表示序列中第i個數合併到第j個數”全部合併“所能得到的最大數值。為什麼是全部合併呢?因為一個區間能夠合併必須滿足能夠找到兩兩相等。

int dp[300][300];
int ans;


int main() {
    int n = readint();
    
for (int i = 1; i <= n; i++) dp[i][i] = readint(); for (int p = 1; p <= n; p++) { for (int i = 1, j = i + p; i <= n && j <= n;i++, j = i + p) { for (int pos = i; pos < j; pos++) { if (dp[i][pos] == dp[pos + 1][j] && dp[i][pos] && dp[pos + 1
][j]) { dp[i][j] = max(dp[i][j], dp[i][pos] + 1); ans = max(ans, dp[i][pos] + 1); } } } } printf("%d", ans); }