USACO 2016 US Open Contest Gold T3: 248
Posted li-dox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了USACO 2016 US Open Contest Gold T3: 248相关的知识,希望对你有一定的参考价值。
题目大意
给定一个1*n(2≤N≤248)的地图,在里面玩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\n",ans); 21 return 0; 22
以上是关于USACO 2016 US Open Contest Gold T3: 248的主要内容,如果未能解决你的问题,请参考以下文章
USACO 2016 US Open Contest Gold T3: 248
USACO 2014 US Open, Silver Problem 2. Dueling GPSs
「USACO 2021 US Open Platinum」Balanced Subsets