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
没写