# 训练记录5：基础练习题：dp

## 动态规划dp

#### 基础动态规划

poj3176

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<iomanip>
using namespace std;
typedef long long ll;
const long long ll_inf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
const int Mod=1e9+7;
const int Max=350;
//for(int i=0;i<n;i++)
//cout<<setw(8)<<fixed<<setprecision(3);
//ios::sync_with_stdio(false);

int main(){
int n;
cin>>n;
int a[Max][Max];
for(int i=0;i<n;i++){
for(int j=0;j<i+1;j++){
cin>>a[i][j];
}
}
for(int i=1;i<n;i++){
for(int j=0;j<i+1;j++){
if(j==0)
a[i][j]=a[i-1][j]+a[i][j];
else if(j==i)
a[i][j]=a[i-1][j-1]+a[i][j];
else
a[i][j]=max(a[i-1][j-1]+a[i][j],a[i-1][j]+a[i][j]);
}
}
int ans=0;
for(int i=0;i<n;i++){
ans=max(a[n-1][i],ans);
}
cout<<ans;
}

疯狂写水题找自信

poj2229

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<iomanip>
using namespace std;
typedef long long ll;
const long long ll_inf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
const int Max=1000000+5;
const int Mod=1e9;
//cout<<setw(8)<<fixed<<setprecision(3);
//ios::sync_with_stdio(false);
int dp[Max];
int main(){
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for (int i=3;i<Max;i++){
if (i%2==1){
dp[i] = dp[i-1]%Mod;
}else
dp[i]=(dp[i/2]+dp[i-1])%Mod;
}
int a;
scanf("%d",&a);
printf("%d\n",dp[a]);
return 0;
}

	memset(dp,0,sizeof(dp));
dp[0]=1;
for(i=1;i<=n;i=i<<1){
for(j=i;j<=n;j++){
dp[j]+=dp[j-i];
dp[j]%=Mod;
}
}
cout<<dp[n]<<endl;

poj2385

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<iomanip>
using namespace std;
typedef long long ll;
const long long ll_inf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
const int Max=1000+5;
const int Mod=1e9;
//cout<<setw(8)<<fixed<<setprecision(3);
//ios::sync_with_stdio(false);
int main(){
int t,w;
cin>>t>>w;
int apple[Max];
for(int i=1;i<=t;i++){
cin>>apple[i];
}
int dp[31][Max]={0};
for(int j=1;j<=t;j++){
if(apple[j]==1)
dp[0][j]=dp[0][j-1]+1;
else
dp[0][j]=dp[0][j-1];
}
for(int i=1;i<30;i++){
dp[i][1]=1;
}
for(int i=1;i<=w;i++){//次数
for(int j=2;j<=t;j++){//第几分钟
if(apple[j]==i%2+1)
dp[i][j]=max(dp[i][j-1],dp[i-1][j-1])+1;
else
dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]);
}
}
cout<<dp[w][t]<<'\n';
}

poj3616

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<iomanip>
using namespace std;
typedef long long ll;
const long long ll_inf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
const int Max=1000+5;
const int Mod=1e9;
#define _for(i,n) for(int i=0;i<n;++i)
#define _rep(i,n) for(int i=1;i<=n;++i)
//cout<<setw(8)<<fixed<<setprecision(3);
//ios::sync_with_stdio(false);
int N,M,R;
int dp[Max];
struct node{
int sta,end,val;
bool operator < (const node &r) const{
return sta<r.sta;
}
}cow[Max];
int main(){
cin>>N>>M>>R;
_for(i,M){
cin>>cow[i].sta>>cow[i].end>>cow[i].val;
}
int ans=0;
sort(cow,cow+M);//开始时间排序
_for(i,M){
dp[i]=cow[i].val;
_for(j,i){
if(cow[i].sta>=cow[j].end+R)
dp[i]=max(dp[i],dp[j]+cow[i].val);
}
ans=max(ans,dp[i]);
}
cout<<ans<<'\n';
return 0;
}

第一个式子很好理解，当左右两头相等，则已经是回文串，耗费与去掉左右两头的字符串变成回文串的花费相同

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<iomanip>
using namespace std;
typedef long long ll;
const long long ll_inf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
const int Max=2000+5;
const int Mod=1e9;
#define _for(i,n) for(int i=0;i<n;++i)
#define _rep(i,n) for(int i=1;i<=n;++i)
//cout<<setw(8)<<fixed<<setprecision(3);
//ios::sync_with_stdio(false);
int dp[Max][Max]={0};
int n,m;
string s;
int a[Max];
int w[30];
int main(){
cin>>n>>m;
cin>>s;
_for(i,n){
a[i]=s[i]-'a';
}
int x,y;
char ch;
_for(i,n){
cin>>ch>>x>>y;
w[ch-'a']=min(x,y);
}
sort(al,al+n);
for(int i=m-1;i>=0;i--){
for(int j=i+1;j<m;j++){
if(a[i]==a[j])
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(dp[i+1][j]+w[a[i]],dp[i][j-1]+w[a[j]]);
}
}
cout<<dp[0][m-1]<<'\n';
}

poj1742

• 0
点赞
• 0
收藏
觉得还不错? 一键收藏
• 打赏
• 1
评论
08-29
09-16 449
09-21 79
09-15 192
09-17 534
09-16 254
09-17 205
09-20 77
09-19 95
09-16 240
09-15 340
09-15 214

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。