其他分享
首页 > 其他分享> > E. Array Shrinking USACO16OPEN]248 G

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