Educational Codeforces Round 83 Array Shrinking

题意:
每次可以选择相邻并且相等的数合并变成一个数,该数的值为该值+1,问怎样合并使得最后数组最少
图片说明
我区间dp太弱了,看不出来,状态转移就是单纯的图片说明
另外额外开一个二维a数组 记录l~r之间是否能合并,并记录合并完的结果
如果l~r之间能合并 那么直接合并把dp[l][r]变成1就行了。

    #include<iostream>
    #include<cstring>
    using namespace std;
    int dp[510][510];
    int a[510][510];
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i][i];    
        memset(dp,0x3f,sizeof dp);
        for(int i=1;i<=n;i++)
            dp[i][i]=1;
        for(int len=2;len<=n;len++)
            for(int l=1;l+len-1<=n;l++)
            {
                int r=l+len-1;
                for(int k=l;k<r;k++)
                {
                    dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
                    if(a[l][k]==a[k+1][r] && dp[l][k]==1 && dp[k+1][r]==1)
                        dp[l][r]=1,a[l][r]=a[l][k]+1;
                }
            }
        cout<<dp[1][n]<<endl;
    }
全部评论
棒!
点赞 回复 分享
发布于 2020-12-16 23:10

相关推荐

11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务