E. Array Shrinking.Educational Codeforces Round 83 (Rated for Div. 2)
教育场的一道区间dp题;
题目让在相邻两项如果相等则可以合并且++的条件下求最短的区间长度。
可以枚举区间长度,然后再在每个长度下遍历数组。
而对于每一个区间,其最终值等于其子区间值的和。那么就需要遍历每个长度时遍历其子区间。
如果遇到某两个子区间之间经过一系列操作后长度都为1且相等,则可以将他们合并。
上代码
#include<bits/stdc++.h> using namespace std; long long a[505][505]; long long dp[505][505]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { dp[i][j]=j-i+1; } } for(int i=1;i<=n;i++) { cin>>a[i][i]; } for(int i=len;i<=n;i++) { for(int j=1;j<=n-len+1;j++) { int r=j+len-1; for(int k=j;k<r;k++) { dp[j][r]=min(dp[j][r],dp[j][k]+dp[k+1][r]); if(dp[j][k]==1&&dp[k+1][r]==1&&a[j][k]==a[k+1][r]) { a[j][r]=a[j][k]+1; dp[j][r]=1; } } } } cout<<dp[1][n]<<endl; }
rush!