zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    AGC044D Guess the Password
    CF1290E Cartesian Tree
    loj2537. 「PKUWC2018」Minimax
    loj3166. 「CEOI2019」魔法树
    CF702F T-Shirts
    CF1260F Colored Tree
    CF1340F Nastya and CBS
    CF1017G The Tree
    CF150E Freezing with Style
    前端开发 -- HTML
  • 原文地址:https://www.cnblogs.com/LI-dox/p/11219112.html
Copyright © 2011-2022 走看看