E. Array Shrinking USACO16OPEN]248 G
作者:互联网
题目链接:https://www.luogu.com.cn/problem/CF1312E
思路:dp[i][j] 表示 合并i到j的最小长度, 那么转移dp[i][j]=min(dp[i][j],dp[i][k],dp[k+1][j]) 很好想到
考虑如何来使两段相邻的区间来合并成一段 当只有区间长度合并到为1时 才能和相邻的比较能不能继续合并
同时记录区间的值为多少 当相等的时候才可以合并
自己考虑合并q的时候 要考虑当前状态是不是已经被子问题解决过
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pb push_back 4 using namespace std; 5 const int maxn=5e2+10; 6 const int mod=1e9+7; 7 int dp[maxn][maxn]; 8 int sum[maxn][maxn]; 9 int a[maxn]; 10 11 12 int main() 13 { 14 ios::sync_with_stdio(0); 15 cin.tie(0); 16 int n; 17 cin>>n; 18 for(int i=1;i<=n;i++) 19 for(int j=1;j<=n;j++) 20 dp[i][j]=1e9; 21 for(int i=1;i<=n;i++) 22 { 23 cin>>a[i]; 24 dp[i][i]=1; 25 sum[i][i]=a[i]; 26 } 27 for(int len=1;len<=n;len++) 28 { 29 for(int i=1;i+len-1<=n;i++) 30 { 31 int j=i+len-1; 32 for(int k=i;k<j;k++) 33 { 34 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); 35 if(dp[i][k]==1&&dp[k+1][j]==1&&sum[i][k]==sum[k+1][j]) 36 sum[i][j]=sum[i][k]+1,dp[i][j]=1; 37 } 38 } 39 } 40 cout<<dp[1][n]<<'\n'; 41 42 43 44 }View Code
题目链接:https://www.luogu.com.cn/problem/P3146
dp[i][j] 代表i~j合并出来的最大值 当两边区间的值相等的时候可以继续合并
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pb push_back 4 using namespace std; 5 const int maxn=5e2+10; 6 const int mod=1e9+7; 7 int dp[maxn][maxn]; 8 9 10 int main() 11 { 12 ios::sync_with_stdio(0); 13 cin.tie(0); 14 int n; 15 cin>>n; 16 for(int i=1;i<=n;i++) 17 { 18 int x; 19 cin>>x; 20 dp[i][i]=x; 21 } 22 int ans=0; 23 for(int len=2;len<=n;len++) 24 { 25 for(int i=1;i+len-1<=n;i++) 26 { 27 int j=i+len-1; 28 for(int k=i;k<j;k++) 29 { 30 if(dp[i][k]==dp[k+1][j]) 31 dp[i][j]=max(dp[i][j],dp[i][k]+1); 32 } 33 ans=max(ans,dp[i][j]); 34 } 35 } 36 cout<<ans<<'\n'; 37 38 39 40 }View Code
标签:const,int,合并,len,maxn,USACO16OPEN,Array,Shrinking,dp 来源: https://www.cnblogs.com/winfor/p/14163438.html