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);
}
原文地址:https://www.cnblogs.com/hznumqf/p/13424828.html