码迷,mamicode.com
首页 > 其他好文 > 详细

NOIP2010 乌龟棋(多维DP)

时间:2015-08-16 21:32:02      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:思维题

考试的时候老是在想第一维是走到点i时候的最大值,然后没有考虑到这样可以计算出每种牌用了多少张。。。。。

dp[i][j][k][l]表示第一种牌用i张,第二种牌用j张,第三种牌用k张,第四种牌用l张的最大值

#include<cstdio>
#include<iostream>
#define MAXN 355
using namespace std;
int c[5],a[MAXN],f[41][41][41][41];
int n,m;
int main()
{
	scanf("%d%d",&n,&m);
	int x;
	for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
	for(int i = 1; i <= m; i++)
	{
		scanf("%d",&x);
		c[x]++;
	}
	f[0][0][0][0] = a[1];
	f[1][0][0][0] = a[2];
	f[0][1][0][0] = a[3];
	f[0][0][1][0] = a[4];
	f[0][0][0][1] = a[5];
	for(int i = 0; i <= c[1]; i++)
	for(int j = 0; j <= c[2]; j++)
	for(int k = 0; k <= c[3]; k++)
	for(int l = 0; l <= c[4]; l++)
	{
		int w = i,x = j,y = k,z = l;
		if(w != 0) w = f[i-1][j][k][l];
		if(x != 0) x = f[i][j-1][k][l];
		if(y != 0) y = f[i][j][k-1][l];
		if(z != 0) z = f[i][j][k][l-1];
		int t = max(w,max(x,max(y,z)));
		f[i][j][k][l] = t + a[1+i+2*j+3*k+4*l];
	}
	printf("%d\n",f[c[1]][c[2]][c[3]][c[4]]);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

NOIP2010 乌龟棋(多维DP)

标签:思维题

原文地址:http://blog.csdn.net/cqbzwja/article/details/47705163

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!