zoukankan      html  css  js  c++  java
  • P3146 [USACO16OPEN]248 G

    有 n 个整数,求将其合并的最大值。
    合并规则为:只有相邻且相等的两个数字能够合并,且合并的值为 合并前的值+1 题目链接
    例如输入的值为 4 1 1 1 2, 输出的值应该为 3 。
    首先将第二个和第三个数进行合并,那么这串数字变为 1 2 2,将2,2合并得 3 。

    方法:区间DP
    状态表示:f[i][j] 表示将i~j的所有数字全部合并的值
    状态计算:枚举中间值 k ,判断条件是f[l][k] == f[k+1][r],并且二者不能为0,因为如果为 0 就表示这个区间的值无法合并,这样的 f 是无意义的

    Code:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int N = 300;
    
    int n;
    int ans = -1e9;
    int f[N][N];
    
    int main()
    {
        cin >> n;
        for(int i = 1;i <= n;i++)
        {
            cin >> f[i][i];
            ans = max(ans, f[i][i]);
        }
        
        for(int len = 2;len <= n;len++)
        {
            for(int i = 1;i <= n && i+len-1 <= n;i++)
            {
                int l = i,r = i+len-1;
                for(int k = l;k < r;k++)
                    if(f[l][k] == f[k+1][r] && f[l][k] && f[k+1][r])
                    {
                        f[l][r] = max(f[l][r], f[l][k]+1);
                        ans = max(ans,f[l][k]+1);
                    }
            }
        }
        cout << ans << endl;
        
        return 0;
    }
    
  • 相关阅读:
    好看的壁纸网站
    python简介
    python学习之基本语法(1)
    信息系统开发方法
    数据库连接池的使用小结
    软件版本后的字母含义
    信息系统与信息化
    软考
    实施过程中的项目管理
    mysql查SQL执行速度
  • 原文地址:https://www.cnblogs.com/zcxy/p/12926792.html
Copyright © 2011-2022 走看看