题目大意
给定一个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 ",ans); 21 return 0; 22 }