zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    Munge
    file upload custom form
    随笔摘要
    生成css 和 清缓存
    drupal commit 原则
    Git reset --hard
    www-data
    301/302的区别
    什么是request_uri
    in_array foreach array_search的性能比较
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13424828.html
Copyright © 2011-2022 走看看