C++线性DP-最优解问题、方案数问题
滑翔翼
#include <bits/stdc++.h>
using namespace std;
int a[5005];
int f[5005],f2[5005];
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n;cin>>n;for(int i=1; i<=n; i++) cin>>a[i];for(int i=1; i<=n; i++){f[i]=1;for(int j=i-1; j>=1; j--){if(a[j]<a[i]) f[i]=max(f[i],f[j]+1);}}for(int i=n; i>=1; i--){f2[i]=1;for(int j=i+1; j<=n; j++){if(a[j]<a[i]) f2[i]=max(f2[i],f2[j]+1);}}int ans=1;for(int i=1; i<=n; i++) ans=max(ans,max(f[i],f2[i]));cout<<ans;return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[5005];
int f[5005],f2[5005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=1; i<=n; i++)
{
f[i]=1;
for(int j=i-1; j>=1; j--)
{
if(a[j]<a[i]) f[i]=max(f[i],f[j]+1);
}
}
for(int i=n; i>=1; i--)
{
f2[i]=1;
for(int j=i+1; j<=n; j++)
{
if(a[j]<a[i]) f2[i]=max(f2[i],f2[j]+1);
}
}
int ans=1;
for(int i=1; i<=n; i++) ans=max(ans,max(f[i],f2[i]));
cout<<ans;
return 0;
}
最大上升子序列和
#include <bits/stdc++.h>
using namespace std;
int a[1005];
int f[1005];
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n;cin>>n;for(int i=1; i<=n; i++) cin>>a[i];for(int i=n; i>=1; i--){for(int j=i; j<=n; j++){if(a[j]>a[i]) f[i]=max(f[i],f[j]);}f[i]+=a[i];}int ans=0;for(int i=1; i<=n; i++){//cout<<i<<":"<<f[i]<<" "<<f2[i]<<'\n';ans=max(ans,f[i]);}cout<<ans;return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[1005];
int f[1005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=n; i>=1; i--)
{
for(int j=i; j<=n; j++)
{
if(a[j]>a[i]) f[i]=max(f[i],f[j]);
}
f[i]+=a[i];
}
int ans=0;
for(int i=1; i<=n; i++)
{
//cout<<i<<":"<<f[i]<<" "<<f2[i]<<'\n';
ans=max(ans,f[i]);
}
cout<<ans;
return 0;
}
开餐馆
#include <bits/stdc++.h>
using namespace std;
int n,k;
int m[105],p[105];
int s[105];
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>k;for(int i=1; i<=n; i++) cin>>m[i];for(int i=1; i<=n; i++) cin>>p[i];for(int i=1; i<=n; i++){s[i]=p[i];for(int j=1; j<i; j++){if(m[j]+k<m[i]) s[i]=max(s[i],s[j]+p[i]);else break; }}int ans=0;for(int i=1; i<=n; i++) ans=max(ans,s[i]);cout<<ans;return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n,k;
int m[105],p[105];
int s[105];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i=1; i<=n; i++) cin>>m[i];
for(int i=1; i<=n; i++) cin>>p[i];
for(int i=1; i<=n; i++)
{
s[i]=p[i];
for(int j=1; j<i; j++)
{
if(m[j]+k<m[i]) s[i]=max(s[i],s[j]+p[i]);
else break;
}
}
int ans=0;
for(int i=1; i<=n; i++) ans=max(ans,s[i]);
cout<<ans;
return 0;
}