简单DP

洛谷P1802

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn=1010;
ll lose[maxn],win[maxn],use[maxn];
ll f[maxn][maxn];

int main()
{
	int n,x;
	cin>>n>>x;
	for(int i=1;i<=n;++i){
		scanf("%ld%ld%ld",&lose[i],&win[i],&use[i]);
	}
	for(int i=1;i<=n;++i){
		for(int j=0;j<=x;++j){
			if(j-use[i]>=0) f[i][j]=max(f[i-1][j]+lose[i],f[i-1][j-use[i]]+win[i]);
			else f[i][j]=f[i-1][j]+lose[i];
		}
	}
	cout<<f[n][x]*5<<endl;
	return 0;
}

洛谷P1002
DFS做法:(TLE两个点)

#include<bits/stdc++.h>

using namespace std;

const int maxn=30;

int n,m,xm,ym,cnt;

int dx[]={1,0},dy[]={0,1};
bool book[maxn][maxn];

void dfs(int x,int y){
	if(x==n&&y==m){
		cnt++;
		return;
	}
	if(book[x][y]||x>n||y>m) return;
	for(int i=0;i<2;++i){
		int nx=x+dx[i],ny=y+dy[i];
		if(!book[nx][ny]&&nx<=n&&ny<=m) dfs(nx,ny);
	}
}

int main()
{
	cin>>n>>m>>xm>>ym;
	book[xm][ym]=true;
	int dx[]={2,1,-1,-2,-2,-1,1,2},dy[]={1,2,2,1,-1,-2,-2,-1};
	for(int i=0;i<8;++i){
		if(xm+dx[i]>=0&&ym+dy[i]>=0) book[xm+dx[i]][ym+dy[i]]=true;
	}
	dfs(0,0);
	cout<<cnt<<endl;
	return 0;
 }

DP做法:

#include<bits/stdc++.h>

using namespace std;

const int maxn=300;
unsigned long long f[maxn][maxn];
bool book[maxn][maxn];

int main()
{
	int n,m,mx,my;
	cin>>n>>m>>mx>>my;
	book[mx][my]=true;
	int dx[]={2,1,-1,-2,-2,-1,1,2},dy[]={1,2,2,1,-1,-2,-2,-1};
	for(int i=0;i<8;++i) book[mx+dx[i]][my+dy[i]]=true;
	f[0][0]=1;
	for(int i=0;i<=n;++i){
		for(int j=0;j<=m;++j){
			if(!book[i][j]) f[i][j]=max(f[i-1][j]+f[i][j-1],f[i][j]);
		}
	}
	cout<<f[n][m]<<endl;
	return 0;
 }

洛谷P1616 完全背包模板题

#include<bits/stdc++.h>

using namespace std;

const int maxn=1100;
int f[maxn];
int a[maxn],b[maxn];

int main()
{
	int t,m;
	cin>>t>>m;
	for(int i=1;i<=m;++i){
		scanf("%d%d",&a[i],&b[i]);
	}
	for(int i=1;i<=m;++i){
		for(int j=a[i];j<=t;++j){
			f[j]=max(f[j],f[j-a[i]]+b[i]);
		}
	}
	cout<<f[t]<<endl;
	return 0;
}

P2196挖地雷(noip1996))

#include<bits/stdc++.h>

using namespace std;

const int maxn=40;
int dp[maxn];
int num[maxn],pre[maxn];
bool book[maxn][maxn];
int ans,pos,n;

void print(int x){
	if(pre[x]) print(pre[x]);
	cout<<x<<" ";
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>num[i]; 
		dp[i]=num[i];
	}
	for(int i=1;i<=n-1;++i){
		dp[i]=num[i];
		for(int j=i+1;j<=n;++j){
			cin>>book[i][j];
		}
	}
	for(int i=1;i<=n;++i){
		dp[i]=num[i];
		for(int j=1;j<i;++j){
			if(book[j][i]&&dp[i]<dp[j]+num[i]){
				dp[i]=dp[j]+num[i];
				pre[i]=j;
			}
		}
		if(ans<dp[i]){
			ans=dp[i];
			pos=i;
		}
	}
	print(pos);
	cout<<endl<<ans<<endl;
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值