【动态规划3】区间与环形动态规划
题单链接:【动态规划3】区间与环形动态规划
- 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题还有另外一种做法,利用LCS求解,可以看另外一篇文章:【动态规划2】线性状态动态规划
| Heavenhold。
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=998244353; const int MAX=270007; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[1010][1010];
 
 
 
 
 
  void solve() {     std::string s;  std::cin>>s;     int len=s.size();     s='@'+s;     for(int k=2;k<=len;k++)     {         for(int i=1;i<len;i++)         {             int j=i+k-1;             if(s[i]==s[j])  dp[i][j]=dp[i+1][j-1];             else    dp[i][j]=std::min(dp[i+1][j],dp[i][j-1])+1;         }     }     std::cout<<dp[1][len]<<"\n"; } int main(){     std::ios::sync_with_stdio(false),std::cin.tie(nullptr);     int t=1;          while(t--)solve();     return 0; }
   | 
 
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=998244353; const int MAX=270007; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[310][310];
 
 
 
  int a[310]; int sum[310];
  void solve() {     int n;  std::cin>>n;     for(int i=1;i<=n;i++)     {         std::cin>>a[i];         sum[i]=sum[i-1]+a[i];     }     memset(dp,0x3f,sizeof(dp));     for(int i=1;i<=n;i++)     {         dp[i][i]=0;     }     for(int k=2;k<=n;k++)     {         for(int i=1;i<n;i++)         {             int j=i+k-1;             for(int p=i;p<=j && j<=n ;p++)                 {                 dp[i][j]=std::min(dp[i][j],dp[i][p]+dp[p+1][j]+sum[j]-sum[i-1]);             }         }     }     std::cout<<dp[1][n]; } int main(){     std::ios::sync_with_stdio(false),std::cin.tie(nullptr);     int t=1;          while(t--)solve();     return 0; }
   | 
 
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=998244353; const int MAX=270007; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[510][510];
 
 
 
 
 
 
 
  int a[510]; void solve() {     int n;  std::cin>>n;     for(int i=1;i<=n;i++)     {         std::cin>>a[i];
      }     memset(dp,0x3f,sizeof(dp));     for(int i=1;i<n;i++)     {         dp[i][i+1]=1+(a[i]!=a[i+1]);     }     for(int i=1;i<=n;i++)   dp[i][i]=1;     for(int k=2;k<=n;k++)     {         for(int i=1;i<n;i++)         {             int j=i+k-1;             if(j<=n)             {                 if(a[i]==a[j] && i+1<=j-1)                 {                                          dp[i][j]=std::min(dp[i+1][j-1],dp[i][j]);                                      }                 for(int p=i;p<j;p++)                 {                     dp[i][j]=std::min(dp[i][j],dp[i][p]+dp[p+1][j]);                                      }             }
          }     }     std::cout<<dp[1][n]<<"\n"; } int main(){     std::ios::sync_with_stdio(false),std::cin.tie(nullptr);     int t=1;          while(t--)solve();     return 0; }
   | 
 
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=19650827; const int MAX=270007; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[1010][1010][2];
 
 
 
 
 
 
 
 
 
  int a[1010]; void solve() {     int n;  std::cin>>n;     for(int i=1;i<=n;i++)   std::cin>>a[i];     for(int i=1;i<=n;i++)   dp[i][i][0]=1;     for(int k=2;k<=n;k++)     {         for(int i=1;i<n;i++)         {             int j=i+k-1;             if(j<=n)             {                 if(a[i]<a[i+1])     dp[i][j][0]+=dp[i+1][j][0];                 if(a[i]<a[j])   dp[i][j][0]+=dp[i+1][j][1];                 if(a[j]>a[j-1])     dp[i][j][1]+=dp[i][j-1][1];                 if(a[i]<a[j])   dp[i][j][1]+=dp[i][j-1][0];                 dp[i][j][0]%=mod;                 dp[i][j][1]%=mod;             }         }     }     std::cout<<(dp[1][n][0]+dp[1][n][1])%mod; } int main(){     std::ios::sync_with_stdio(false),std::cin.tie(nullptr);     int t=1;          while(t--)solve();     return 0; }
   | 
 
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=19650827; const int MAX=270007; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[55][55];
 
 
 
 
 
 
 
  void solve() {     std::string s;  std::cin>>s;     int n=s.size();     s='@'+s;     memset(dp,0x3f,sizeof(dp));     for(int i=1;i<=n;i++)   dp[i][i]=1;     for(int k=2;k<=n;k++)     {         for(int i=1;i<=n;i++)         {             int j=i+k-1;             if(j>n)   break;             if(s[i]==s[j])  dp[i][j]=std::min(dp[i+1][j],dp[i][j-1]);             for(int p=i;p<j;p++)             {                 dp[i][j]=std::min(dp[i][j],dp[i][p]+dp[p+1][j]);             }         }     }     std::cout<<dp[1][n]<<"\n"; } int main(){     std::ios::sync_with_stdio(false),std::cin.tie(nullptr);     int t=1;          while(t--)solve();     return 0; }
   | 
 
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=19650827; const int MAX=270007; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[210][210];
 
 
 
 
 
 
  int a[210]; void solve() {     int n;  std::cin>>n;     for(int i=1;i<=n;i++)   std::cin>>a[i],a[i+n]=a[i];     int ans=0;     for(int k=2;k<=n;k++)     {         for(int i=1;i+k-1<=2*n;i++)         {             int j=i+k-1;                          for(int p=i;p<j;p++)             {                 dp[i][j]=std::max(dp[i][j],dp[i][p]+dp[p+1][j]+a[i]*a[p+1]*a[j+1]);                              }         }     }     for(int i=1;i<=n;i++)   ans=std::max(ans,dp[i][i+n-1]);     std::cout<<ans; } int main(){     std::ios::sync_with_stdio(false),std::cin.tie(nullptr);     int t=1;          while(t--)solve();     return 0; }
   | 
 
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=19650827; const int MAX=270007; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp1[210][210];   int dp2[210][210];   int a[210]; int sum[210];
 
 
 
 
  void solve() {     int n;  std::cin>>n;     for(int i=1;i<=n;i++)     {         std::cin>>a[i];         a[i+n]=a[i];     }     for(int i=1;i<=2*n;i++)     {         sum[i]=sum[i-1]+a[i];     }     memset(dp2,0x3f,sizeof(dp2));     for(int i=1;i<=2*n;i++)     dp2[i][i]=0;     for(int k=2;k<=n;k++)     {         for(int i=1;i+k-1<=2*n;i++)         {             int j=i+k-1;             for(int p=i;p<j;p++)             {                 dp1[i][j]=std::max(dp1[i][j],dp1[i][p]+dp1[p+1][j]+sum[j]-sum[i-1]);             }         }     }     for(int k=2;k<=n;k++)     {         for(int i=1;i+k-1<=2*n;i++)         {             int j=i+k-1;             for(int p=i;p<j;p++)             {                 dp2[i][j]=std::min(dp2[i][j],dp2[i][p]+dp2[p+1][j]+sum[j]-sum[i-1]);             }         }     }     int maxAns=0;     int minAns=1e9;     for(int i=1;i<=n;i++)     {         maxAns=std::max(maxAns,dp1[i][i+n-1]);         minAns=std::min(minAns,dp2[i][i+n-1]);     }     std::cout<<minAns<<"\n"<<maxAns; } int main(){     std::ios::sync_with_stdio(false),std::cin.tie(nullptr);     int t=1;          while(t--)solve();     return 0; }
   |