P1048 [NOIP2005 普及组] 采药
本题就是01背包问题。
采药总时间对应背包大小,每个药的采集时间对应物品重量,药的价值对应物品价值
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int m,n,w[101],c[101],f[2001];
int main()
{
cin>>m>>n;
for (int i=1;i<=n;i++) cin>>w[i]>>c[i];
for (int i=1;i<=n;i++)
for (int v=m;v>=w[i];v--)
if (f[v-w[i]]+c[i]>f[v])
f[v]=f[v-w[i]]+c[i];
cout<<f[m]<<endl;
return 0;
}
B3637 最长上升子序列
动态规划模板题,“现在决定未来,未来与过去无关。
#include <bits/stdc++.h>
using namespace std;
int a[5000], ans[5000], n;
int main(){
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
}
ans[0] = 1;
for(int i = 1; i < n; i++){
int maxx = 0;
for(int j = 0; j < i; j++){
if(a[j] < a[i]) maxx = max(maxx, ans[j]);
}
ans[i] = maxx + 1;
}
sort(ans, ans + n);
cout << ans[n - 1];
return 0;
}
P1115 最大子段和
不妨设ans为以第i个数结尾的最大和,并每次计算和。
若当前和比最大值大,就更新最大值。
若当前和比0小,就把和清0。
#include <bits/stdc++.h>
using namespace std;
int n,ans,tmp,a;
int main()
{
cin>>n;
cin>>a;
ans=a;
if(a>0) tmp=a;
for(int i=2;i<=n;i++)
{
cin>>a;
tmp+=a;
if(tmp>ans) ans=tmp;
if(tmp<0) tmp=0;
}
cout<<ans;
return 0;
}
LCS
#include<bits/stdc++.h>
using namespace std;
const int maxn=3005;
string Max(string s1,string s2)
{
return s1.size()>s2.size()?s1:s2;
}
int main()
{
string s1,s2;
string ret[2][maxn]={};
cin>>s1>>s2;
for(int i=1;i<=s1.size();i++){
for(int j=1;j<=s2.size();j++){
if(s1[i-1]==s2[j-1]){
ret[i&1][j]=ret[(i-1)&1][j-1]+s1[i-1];
}else {
ret[i&1][j]=(ret[(i-1)&1][j].size()>ret[i&1][j-1].size()?ret[(i-1)&1][j]:ret[i&1][j-1]);
}
}
}
cout<<Max(ret[0][s2.size()],ret[1][s2.size()])<<endl;
return 0;
}