Atcoder DP Contest
这里是题单的链接:AtCoder DP
Contest - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
目前还有些题目没写 后续学完相关知识再补
A
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); int h[MAXN]; ll dp[MAXN]; void solve() { int n; std::cin>>n; for(int i=1;i<=n;i++) std::cin>>h[i]; dp[2]=abs(h[2]-h[1]); for(int i=3;i<=n;i++) { dp[i]=std::min(dp[i-1]+abs(h[i]-h[i-1]),dp[i-2]+abs(h[i]-h[i-2])); } std::cout<<dp[n]<<"\n"; } int main() { int t=1; while(t--)solve(); return 0; }
|
B
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); int h[MAXN]; ll dp[MAXN];
void solve() { int n; std::cin>>n; int k; std::cin>>k; for(int i=1;i<=n;i++) std::cin>>h[i],dp[i]=1e15; dp[1]=0; for(int i=2;i<=n;i++) { for(int j=1;j<=std::min(k,i-1);j++) dp[i]=std::min(dp[i-j]+abs(h[i]-h[i-j]),dp[i]); } std::cout<<dp[n]<<"\n"; } int main() { int t=1; while(t--)solve(); return 0; }
|
C
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e5+10; const int mod=1e9+7; const double PI=acos(-1); int a[MAXN],b[MAXN],c[MAXN]; ll dp[MAXN][5];
void solve() { int n; std::cin>>n; for(int i=1;i<=n;i++)std::cin>>a[i]>>b[i]>>c[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=3;j++) { if(j==1)dp[i][j]=std::max(dp[i-1][j+1]+a[i],dp[i-1][j+2]+a[i]); if(j==2)dp[i][j]=std::max(dp[i-1][j-1]+b[i],dp[i-1][j+1]+b[i]); if(j==3)dp[i][j]=std::max(dp[i-1][j-1]+c[i],dp[i-1][j-2]+c[i]); } } std::cout<<std::max({dp[n][1],dp[n][2],dp[n][3]})<<"\n"; } int main() { int t=1; while(t--)solve(); return 0; }
|
D
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e5+10; const int mod=1e9+7; const double PI=acos(-1); int w[MAXN], v[MAXN]; ll dp[MAXN];
void solve() { int n; std::cin>>n; int W; std::cin>>W; for(int i=1;i<=n;i++) std::cin>>w[i]>>v[i]; for(int i=1;i<=n;i++) { for(int j=W;j>=w[i];j--) dp[j]=std::max(dp[j],dp[j-w[i]]+v[i]); } std::cout<<dp[W]<<"\n"; } int main() { int t=1; while(t--)solve(); return 0; }
|
E
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); int w[MAXN], v[MAXN]; int dp[MAXN];
void solve() { int n; std::cin>>n; int W; std::cin>>W; int V=0; for(int i=1;i<=n;i++) std::cin>>w[i]>>v[i],V+=v[i]; for(int i=1;i<=V;i++) { dp[i]=0x3f3f3f3f; } for(int i=1;i<=n;i++) { for(int j=V;j>=v[i];j--) dp[j]=std::min(dp[j],dp[j-v[i]]+w[i]); } for(int i=V;i>=0;i--) { if(dp[i]<=W) { std::cout<<i<<'\n'; return; } } } int main() { int t=1; while(t--)solve(); return 0; }
|
F
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); int dp[3010][3010];
void solve() { std::string s,t; std::cin>>s>>t; int n=s.length(),m=t.length(); std::string ans=""; s="@"+s,t="@"+t; for(int i=1;i<=n;i++) { for(int j=1;j<=m;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]); } } } int sp=n,tp=m; while(sp>0&&tp>0) { if(s[sp]==t[tp]) { ans+=s[sp]; sp--;tp--; } else { if(dp[sp-1][tp]>dp[sp][tp-1]) sp--; else tp--; } } std::reverse(ans.begin(),ans.end()); std::cout<<ans<<"\n"; } int main() { int t=1; while(t--)solve(); return 0; }
|
G
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); int dp[MAXN],in[MAXN];
struct Edge{ int from,to; }; std::vector<Edge> edge[MAXN]; void add(int from,int to) { Edge e={from,to}; edge[from].push_back(e); } int b[MAXN];
int dfs(int x) {
if(dp[x]==0) { for (auto t: edge[x]) { dp[x] = std::max(dfs(t.to) + 1, dp[x]); } } return dp[x]; } void solve() { int n,m; std::cin>>n>>m; for(int i=1;i<=m;i++) { int u,v; std::cin>>u>>v; add(u,v); } int ans=0; for(int i=1;i<=n;i++) { ans=std::max(dfs(i),ans); } std::cout<<ans<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
H
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); int dp[1010][1010]; char mp[1010][1010]; void solve() { int h,w; std::cin>>h>>w; for(int i=1;i<=h;i++) { for(int j=1;j<=w;j++)std::cin>>mp[i][j]; } for(int i=1;i<=h;i++) { if(mp[i][1]=='#')break; else dp[i][1]=1; } for(int i=1;i<=w;i++) { if(mp[1][i]=='#')break; else dp[1][i]=1; } for(int i=2;i<=h;i++) { for(int j=2;j<=w;j++) { if(mp[i][j-1]!='#'&&mp[i-1][j]!='#')dp[i][j]=(dp[i-1][j]+dp[i][j-1])%mod; else if(mp[i][j-1]=='#'&&mp[i-1][j]!='#')dp[i][j]=dp[i-1][j]%mod; else if(mp[i-1][j]=='#'&&mp[i][j-1]!='#')dp[i][j]=dp[i][j-1]%mod; } } std::cout<<dp[h][w]<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
I
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); double dp[3010][3010]; double p[3010];
void solve() { int n; std::cin>>n; for(int i=1;i<=n;i++) { std::cin>>p[i]; } dp[0][0]=1; for(int i=1;i<=n;i++) { dp[i][0]=dp[i-1][0]*(1-p[i]); } for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { dp[i][j]=dp[i-1][j-1]*p[i]+dp[i-1][j]*(1-p[i]); } } double ans=0; for(int i=n;i+i>n;i--) { ans+=dp[n][i]; } std::cout<<std::fixed<<std::setprecision(10)<<ans<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
J
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); double dp[310][310][310]; std::map<int,int> m;
void solve() { int n; std::cin>>n; int all=0; for(int i=1;i<=n;i++) { int x; std::cin>>x; m[x]++; }
for(int k=0;k<=n;k++) { for(int j=0;j<=n;j++) { for(int i=0;i<=n;i++) { if(i||j||k) { dp[i][j][k]=(double)n/(i+j+k); if(i)dp[i][j][k]+=i*dp[i-1][j][k]/(i+j+k); if(j)dp[i][j][k]+=j*dp[i+1][j-1][k]/(i+j+k); if(k)dp[i][j][k]+=k*dp[i][j+1][k-1]/(i+j+k); } } } }
std::cout<<std::fixed<<std::setprecision(10)<<dp[m[1]][m[2]][m[3]]<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
K
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); int a[MAXN]; int dp[MAXN];
void solve() { int n,k; std::cin>>n>>k; for(int i=1;i<=n;i++) std::cin>>a[i]; for(int i=1;i<=k;i++) { for(int j=1;j<=n;j++) { if(i>=a[j]) { dp[i]|=!dp[i-a[j]]; } } } std::cout<<(dp[k]?"First":"Second")<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
L
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); int a[3010]; ll dp[3010][3010],sum[3010];
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]; dp[i][i]=a[i]; } for(int i=n-1;i>=1;i--) { for(int j=i+1;j<=n;j++) { dp[i][j]=std::max(sum[j]-sum[i]-dp[i+1][j]+a[i],sum[j-1]-sum[i-1]-dp[i][j-1]+a[j]); } } std::cout<<-(sum[n]-2*dp[1][n]); } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
M
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e5+10; const int mod=1e9+7; const double PI=acos(-1); int a[110]; ll dp[MAXN],sum[MAXN];
void solve() { int n,k; std::cin>>n>>k; for(int i=1;i<=n;i++) { std::cin>>a[i]; } dp[0]=1; for(int i=1;i<=n;i++) { sum[0]=dp[0]; for(int j=1;j<=k;j++) { sum[j]=(sum[j-1]+dp[j])%mod; } for(int j=0;j<=k;j++) { if(j>a[i])dp[j]=(sum[j]-sum[j-a[i]-1]+mod)%mod; else dp[j]=sum[j]%mod; } } std::cout<<dp[k]%mod<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
N
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e6+10; const int mod=1e9+7; const double PI=acos(-1); int a[4010]; ll dp[4010][4010],sum[4010];
void solve() { int n; std::cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dp[i][j]=LONG_LONG_MAX>>1; } } for(int i=1;i<=n;i++) { std::cin>>a[i]; sum[i]=sum[i-1]+a[i]; dp[i][i]=0; } for(int l=2;l<=n;l++) { for(int i=1;i+l-1<=n;i++) { int j=i+l-1; for(int k=i;k<j;k++) { dp[i][j]=std::min(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1],dp[i][j]); } } } std::cout<<dp[1][n]<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
O
#include<bits/stdc++.h> using ll=long long; const int MAXN=3e6+10; const int mod=1e9+7; const double PI=acos(-1);
int a[25][25];
int dp[MAXN];
void solve() { int n; std::cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { std::cin>>a[i][j]; } } dp[0]=1; for(int i=0;i<(1<<n);i++) { int cnt=__builtin_popcount(i); for(int j=0;j<n;j++) { if(a[cnt][j]&&(i&(1<<j))==0) { dp[i|(1<<j)]=(dp[i|(1<<j)]+dp[i])%mod; } } } std::cout<<dp[(1<<n)-1]<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
P
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e5+10; const int mod=1e9+7; const double PI=acos(-1); struct Edge { int from,to; }; std::vector<Edge> edge[MAXN]; void add(int from,int to) { Edge e={from,to}; edge[from].push_back(e); } ll dp[MAXN][2];
bool vis[MAXN];
void dfs(int x) { for(auto e:edge[x]) { int y=e.to; if(vis[y])continue; vis[y]=true; dfs(y); dp[x][0]*=(dp[y][0]+dp[y][1]); dp[x][0]%=mod; dp[x][1]*=dp[y][0]; dp[x][1]%=mod; } } void solve() {
int n; std::cin>>n; for(int i=1;i<n;i++) { int u,v; std::cin>>u>>v; add(u,v); add(v,u); } for(int i=1;i<=n;i++) { dp[i][0]=dp[i][1]=1; } vis[1]=true; dfs(1); ll ans=0; ans=(dp[1][0]+dp[1][1])%mod; std::cout<<ans<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
Q
#include<bits/stdc++.h> using ll=long long; const int MAXN=2e5+10; const int mod=1e9+7; const double PI=acos(-1); ll dp[MAXN]; ll be[1010]; ll b[MAXN];
int h[MAXN],a[MAXN]; int block; void update(ll x,ll y) { b[x]=std::max(b[x],y); be[x/block+1]=std::max(be[x/block+1],y); } ll query(int r) { ll ans=0; for(int i=1;i<=r/block;i++) { ans=std::max(ans,be[i]); } for(int i=r/block*block;i<=r;i++) { ans=std::max(ans,b[i]); } return ans; } void solve() { int n; std::cin>>n; block=std::sqrt(n); for(int i=1;i<=n;i++) { std::cin>>h[i]; } for(int i=1;i<=n;i++) { std::cin>>a[i]; } ll ans=0; for(int i=1;i<=n;i++) { dp[i]=query(h[i]-1)+a[i]; update(h[i],dp[i]); ans=std::max(ans,dp[i]); } std::cout<<ans<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
R
没写
S
#include<bits/stdc++.h> using ll=long long; const int MAXN=1e5+10; const int mod=1e9+7; const double PI=acos(-1); int a[10010],dp[10010][110][2];
int cnt,D; int dfs(int pos,int sum,bool limit) { auto &d=dp[pos][sum][limit]; int ans=0; if(pos==cnt) { if(sum%D==0) return 1; return 0; } if(d!=-1) return d; for(int i=0;i<=(limit?a[pos]:9);i++) { ans+=dfs(pos+1,(sum+i)%D,limit && i==a[pos]); ans%=mod; } d=ans; return ans; } void solve() { std::string k; std::cin>>k>>D; memset(dp,-1,sizeof(dp)); for(int i=0;i<k.length();i++) { a[cnt++]=k[i]-'0'; } std::cout<<(dfs(0,0,true)-1+mod)%mod<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
T
没写
U
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> using ll=long long; const int MAXN=1e5+10; const int mod=1e9+7; const double PI=acos(-1); ll a[20][20]; ll dp[MAXN];
void solve() { int n; std::cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { std::cin>>a[i][j]; } } for(int i=0;i<(1<<n);i++) { for(int j=0;j<n;j++) { for(int k=j+1;k<n;k++) { if((i>>j)&1 && (i>>k)&1) dp[i]+=a[j][k]; } } }
for(int i=0;i<(1<<n);i++) { for(int j=i;j;j=(j-1)&i) { dp[i]=std::max(dp[i],dp[j]+dp[i^j]); } } std::cout<<dp[(1<<n)-1]<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
V
没写
W
没写
X
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> using ll=long long; const int MAXN=1e5+10; const int mod=1e9+7; const double PI=acos(-1); struct node { ll w,s,v; bool operator<(const node&b) { return w+s<b.w+b.s; } }a[1010]; ll dp[MAXN];
void solve() { int n; std::cin>>n; for(int i=1;i<=n;i++) std::cin>>a[i].w>>a[i].s>>a[i].v; std::sort(a+1,a+1+n); dp[0]=0; ll MAX=a[n].s+a[n].w; for(int i=1;i<=n;i++) { for(ll j=a[i].w+a[i].s;j>=a[i].w;j--) { dp[j]=std::max(dp[j-a[i].w]+a[i].v,dp[j]); } } ll ans=0; for(int i=0;i<=MAX;i++) { ans=std::max(ans,dp[i]); } std::cout<<ans<<"\n"; } int main() { std::ios::sync_with_stdio(false); int t=1; while(t--)solve(); return 0; }
|
Y
没写
Z
没写