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