• USACO 2016 US Open Contest Gold T3: 248


    题目大意

    给定一个1*n(2N248)的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-40),问最大能合出多少。注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3。

    题目分析

    观察数据范围与题目,n<=248 并且 “每次可以合并相邻两个” ,不难想到要使用区间DP。

    令 f[i][j] 表示区间 i~j 合并的最大值,则显然,转移为 (i < k < j )若f[i][k]==f[k+1][j] 则 f[i][j]=max(f[i][k]+1,f[i][j])。dp过程中取max即为答案。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int MAXN=255;
     5 int n,ans;
     6 int f[MAXN][MAXN];
     7 int main(){
     8     scanf("%d",&n);
     9     for(int i=1;i<=n;++i){
    10         scanf("%d",&f[i][i]);
    11         ans=max(ans,f[i][i]);
    12     }
    13     for(int i=n-1;i>=1;--i)
    14         for(int j=i+1;j<=n;++j)
    15             for(int k=i;k<j;++k){
    16                 if(f[i][k]==f[k+1][j])
    17                     f[i][j]=max(f[i][j],f[i][k]+1);
    18                 ans=max(ans,f[i][j]);
    19             }
    20     printf("%d
    ",ans);
    21     return 0;
    22 }
  • 相关阅读:
    刚开始用springboot踩的好多坑!!!
    AngularJS学习(一)
    linux上的第一个c语言程序
    设计模式——6大设计原则
    C# List的深复制
    C# XML 操作
    C#多线程学习
    实现树形结构
    观察者模式
    python3.3 MD5
  • 原文地址:https://www.cnblogs.com/LI-dox/p/11219112.html
Copyright © 2020-2023  润新知