【动态规划2】线性状态动态规划
题单链接:【动态规划2】线性状态动态规划
- 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h> using ll=long long; const int N=5010; const int MAXN=1e6+10; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int a[MAXN]; int dp[MAXN];
void solve() { int cnt,x; while(std::cin>>x) { a[++cnt]=x; } memset(dp,MAXN,sizeof(dp)); dp[1]=a[1]; int len=1; for(int i=2;i<=cnt;i++) { if(a[i]<=dp[len]) dp[++len]=a[i]; else { *std::upper_bound(dp+1,dp+1+len,a[i],std::greater<int>())=a[i]; } } std::cout<<len<<"\n";
memset(dp,0,sizeof(dp)); dp[1]=a[1]; len=1;
for(int i=2;i<=cnt;i++) { if(a[i]>dp[len]) dp[++len]=a[i]; else *std::lower_bound(dp+1,dp+1+len,a[i])=a[i]; } std::cout<<len<<"\n"; } int main(){ int t=1; while(t--)solve(); return 0; }
|
#include<bits/stdc++.h> using ll=long long; const int N=5010; const int MAXN=1e6+10; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int t[MAXN],x[MAXN],y[MAXN]; int dp[MAXN];
void solve() { int n,m; std::cin>>n>>m; for(int i=1;i<=m;i++) std::cin>>t[i]>>x[i]>>y[i]; int ans=0; for(int i=1;i<=m;i++) { dp[i]=1; for(int j=1;j<i;j++) { if(dp[j]+1>dp[i] && std::abs(x[i]-x[j])+std::abs(y[i]-y[j])<=t[i]-t[j]) dp[i]=dp[j]+1; } ans=std::max(ans,dp[i]); } std::cout<<ans<<"\n"; } int main(){ int t=1; while(t--)solve(); return 0; }
|
#include<bits/stdc++.h> using ll=long long; const int N=5010; const int MAXN=2e5+10; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; ll a[MAXN]; std::deque<ll> dq; ll dp[MAXN];
void solve() { int n,l,r; std::cin>>n>>l>>r; for(int i=0;i<=n;i++) std::cin>>a[i],dp[i]=-0x3f3f3f; int len=r-l+1; dp[0]=0; ll ans=-0x3f3f3f; for(int j=l;j<=n;j++) { if(!dq.empty() && j-dq.front()>=len) dq.pop_front(); while(!dq.empty() && dp[dq.back()]<=dp[j-l]) dq.pop_back(); dq.push_back(j-l); dp[j]=dp[dq.front()]+a[j]; if(j+r>n) ans=std::max(ans,dp[j]); } std::cout<<ans<<"\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=2e5+10; const int mod=998244353; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int a[1010]; ll dp[1010][N<<1];
void solve() { int n; std::cin>>n; for(int i=1;i<=n;i++) std::cin>>a[i]; ll ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { dp[i][a[i]-a[j]+N]+=dp[j][a[i]-a[j]+N]+1; dp[i][a[i]-a[j]+N]%=mod; ans+=dp[j][a[i]-a[j]+N]+1; ans%=mod; } } std::cout<<(ans+n)%mod<<"\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=5010; const int MAXN=1e6+10; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int a[MAXN],b[MAXN]; int dp[MAXN]; std::map<int,int> mp;
void solve() { int n; std::cin>>n; for(int i=1;i<=n;i++) { std::cin>>a[i]; mp[a[i]]=i; } for(int i=1;i<=n;i++) std::cin>>b[i]; dp[1]=mp[b[1]]; int len=1; for(int i=2;i<=n;i++) { if(mp[b[i]]>dp[len]) dp[++len]=mp[b[i]]; else *(std::lower_bound(dp+1,dp+1+len,mp[b[i]]))=mp[b[i]]; } std::cout<<len<<"\n"; } int main(){ int t=1; while(t--)solve(); return 0; }
|
#include<bits/stdc++.h> using ll=long long; const int N=5010; const int MAXN=1e6+10; 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 n=s.length(); std::string t; t=s; std::reverse(t.begin(), t.end()); t='@'+t; s='@'+s; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(s[i]==t[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=std::max(dp[i-1][j],dp[i][j-1]); } } std::cout<<n-dp[n][n]<<"\n"; } int main(){ int t=1; while(t--)solve(); return 0; }
|
针对hack的一些看法:P1874 快速求和 - 洛谷专栏
(luogu.com)
#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; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi;
ll num[45][45]; ll dp[45][MAXN];
void solve2() { std::string s; std::cin>>s; ll n; std::cin>>n; ll len=s.length(); s='0'+s; for(ll i=1;i<=len;i++) { for(ll j=i;j<=len;j++) { num[i][j]=num[i][j-1]*10+s[j]-'0'; } } for(ll i=1;i<=len;i++) { for(ll j=0;j<=n;j++) { dp[i][j]=0x3f3f3f3f; } } dp[0][0]=-1; for(ll i=1;i<=len;i++) { for(ll j=0;j<=n;j++) { for(ll k=0;k<i;k++) { if(j>=num[i-k][i]) dp[i][j]=std::min(dp[i][j],dp[i-k-1][j-num[i-k][i]]+1); } } } if(dp[len][n]>=len) std::cout<<-1<<"\n"; else std::cout<<dp[len][n]<<"\n"; } int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve2(); 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; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; ll num[45][45]; ll dp[45][MAXN];
void solve2() { std::string s; std::cin>>s; ll n; std::cin>>n; ll len=s.length(); s='0'+s; for(ll i=1;i<=len;i++) { for(ll j=i;j<=len;j++) { num[i][j]=num[i][j-1]*10+s[j]-'0'; } } memset(dp,0x6f,sizeof(dp)); dp[0][0]=-1; for(ll i=1;i<=len;i++) { for(ll j=0;j<=n;j++) { for(ll k=0;k<i;k++) { if(j>=num[i-k][i] && num[i-k][i]>=0) dp[i][j]=std::min(dp[i][j],dp[i-k-1][j-num[i-k][i]]+1); } } } if(dp[len][n]>=len) std::cout<<-1<<"\n"; else std::cout<<dp[len][n]<<"\n"; } int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve2(); 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; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[2010][2010];
void solve() { std::string a,b; std::cin>>a>>b; a="@"+a; b="@"+b; for(int i=1;i<a.size();i++) { dp[i][0]=i; } for(int j=1;j<b.size();j++) { dp[0][j]=j; } for(int i=1;i<a.size();i++) { for(int j=1;j<b.size();j++) { dp[i][j]=std::min({dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+(a[i]!=b[j])}); } } std::cout<<dp[a.size()-1][b.size()-1]; } 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; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[110],g[110];
int a[110]; 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]=1; for(int j=1;j<i;j++) { if(a[j]<a[i]) dp[i]=std::max(dp[j]+1,dp[i]); } } for(int i=n;i>=1;i--) { g[i]=1; for(int j=n;j>i;j--) { if(a[i]>a[j]) g[i]=std::max(g[j]+1,g[i]); } } int ans=0; for(int i=1;i<=n;i++) { ans=std::max(ans,dp[i]+g[i]-1); } std::cout<<n-ans<<"\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; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; ll a[110][110]; ll dp[110][110];
struct node { int pos[110]; int p; }book[110][110]; void solve2() { int f,v; std::cin>>f>>v; memset(dp,-127,sizeof(dp)); for(int i=1;i<=f;i++){ for(int j=1;j<=v;j++) { std::cin>>a[i][j]; } } for(int i=0;i<=v;i++) dp[0][i]=0; for(int i=1;i<=f;i++) { for(int j=i;j<=v;j++) { if(dp[i-1][j-1]+a[i][j]>dp[i][j-1]) { book[i][j]=book[i-1][j-1]; book[i][j].pos[++book[i][j].p]=j; dp[i][j]=dp[i-1][j-1]+a[i][j]; } else { book[i][j]=book[i][j-1]; dp[i][j]=dp[i][j-1]; } } } std::cout<<dp[f][v]<<"\n"; for(int i=1;i<=book[f][v].p;i++) { std::cout<<book[f][v].pos[i]<<" "; } } int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve2(); 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; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int v[MAXN],w[MAXN],dp[MAXN]; void solve() { int n,sth,stm,eth,etm,cnt=0; char ch; std::cin>>sth>>ch>>stm>>eth>>ch>>etm; int tot=eth*60+etm-sth*60-stm; std::cin>>n; for(int i=1;i<=n;i++) { int t,c,p; std::cin>>t>>c>>p; if(p==0) p=999; for(int j=1;j<=p;j<<=1) { w[++cnt]=j*t; v[cnt]=j*c; p-=j; } if(p) w[++cnt]=p*t,v[cnt]=p*c; } for(int i=1;i<=cnt;i++) { for(int j=tot;j>=w[i];j--) { dp[j]=std::max(dp[j-w[i]]+v[i],dp[j]); } } std::cout<<dp[tot]<<"\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=1e6+10; const int INF=0x3f3f3f3f; const int mod=998244353; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi;
int s[410],f[410];
int dp[MAXN]; int cnt[MAXN];
void solve2() { int n; std::cin>>n; int sum=0; for(int i=1;i<=n;i++) { std::cin>>s[i]>>f[i]; } memset(dp,-0x3f,sizeof(dp)); dp[400000]=0; for(int i=1;i<=n;i++) { if(s[i]>=0) { for(int j=800000;j>=s[i];j--) { dp[j]=std::max(dp[j],dp[j-s[i]]+f[i]); } } else { for(int j=0;j<=800000+s[i];j++) { dp[j]=std::max(dp[j],dp[j-s[i]]+f[i]); } } } int ans=0; for(int i=400000;i<=800000;i++) { if(dp[i]>=0) { ans=std::max(ans,dp[i]+i-400000); } } std::cout<<ans<<"\n"; } int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve2(); 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; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int a[MAXN]; int dp[MAXN]; int num[MAXN];
void solve2() { int n; std::cin>>n; for(int i=1;i<=n;i++) std::cin>>a[i], dp[i]=1; int ans=0; for(int i=1;i<=n;i++) { for(int j=i-1;j>0;j--) { if(dp[i]>ans) break; if(dp[i]<dp[j]+1 && (a[i]&a[j])!=0) { dp[i]=dp[j]+1; } } ans=std::max(ans,dp[i]); } std::cout<<ans<<"\n"; }
int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve2(); 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; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[12][12][12][12];
int num[12][12];
void solve2() { int n; std::cin>>n; int a,b,c; while(std::cin>>a>>b>>c && (a||b||c)) { num[a][b]=c; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { for(int l=1;l<=n;l++) { dp[i][j][k][l]=std::max({dp[i-1][j][k-1][l],dp[i][j-1][k][l-1],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l]})+num[i][j]+num[k][l]; if(i==k && j==l) dp[i][j][k][l]-=num[i][j]; } } } } std::cout<<dp[n][n][n][n]; }
int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve2(); 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; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int a[360]; int dp[45][45][45][45];
int mp[6]; void solve3() { int n,m; std::cin>>n>>m; for(int i=1;i<=n;i++) std::cin>>a[i]; for(int i=1;i<=m;i++) { int x; std::cin>>x; mp[x]++; } dp[0][0][0][0]=a[1]; for(int i=0;i<=mp[1];i++) { for(int j=0;j<=mp[2];j++) { for(int k=0;k<=mp[3];k++) { for(int l=0;l<=mp[4];l++) { auto &d=dp[i][j][k][l]; int dis=1*i+2*j+3*k+4*l+1; if(i) d=std::max(d,dp[i-1][j][k][l]+a[dis]); if(j) d=std::max(d,dp[i][j-1][k][l]+a[dis]); if(k) d=std::max(d,dp[i][j][k-1][l]+a[dis]); if(l) d=std::max(d,dp[i][j][k][l-1]+a[dis]); } } } } std::cout<<dp[mp[1]][mp[2]][mp[3]][mp[4]];
} int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve3(); return 0; }
|
题解链接:题解
P3147 【[USACO16OPEN]262144】
#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[61][MAX];
void solve3() { int n; std::cin>>n; for(int i=1;i<=n;i++) { int x; std::cin>>x; dp[x][i]=i+1; } int ans=0; for(int i=2;i<=58;i++) { for(int j=1;j<=n;j++) { if(dp[i][j]==0) { dp[i][j]=dp[i-1][dp[i-1][j]]; } if(dp[i][j]) ans=i; } } std::cout<<ans<<"\n"; } int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve3(); return 0; }
|