【动态规划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; }
|