HDU1176——免费馅饼

时间紧迫啊,懒得写题目了,直接上链接好了~

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176

题目分析:这里采用的是逆推的思想,好好体会体会,可能还掌握得不是很好。

先把代码附上啦。边境处理的时候还是蛮有技巧的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define M 100002
#define N 12

int dp[N][M];

inline int max(const int a, const int b)
{
	return a > b ? a : b;
}

void main()
{
	int t,x;
	int i,j;
	int n,T;
	int temp;

	while(scanf("%d", &n))
	{
		if(!n)
			break;

		T = 0;
		memset(dp,0,sizeof(dp));

		while(n--)
		{
			scanf("%d %d",&x,&t);
			++dp[x][t];
			T = T > t ? T : t;
		}

		for(j = T - 1; j >= 0; --j)
		{
			for(i = 0; i <= 10; ++i)
			{
				temp = max(dp[i + 1][j + 1],dp[i][j + 1]);
				if(i > 0)
				{
					temp = max(dp[i - 1][j + 1],temp);
				}
				dp[i][j] += temp;
			}
		}
		printf("%d\n",dp[5][0]);
	}
}

最开始为了节省内存,想把dp数组搞成一维的,结果老是出错。先把代码放在这里,以后再说啦~可能有一天就自己想清楚了。

没AC过的代码也放上,以后再思考:不过这种方法确实没有上面一种方法简洁啦~~

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define M 1000002
#define N 13

int dp[2][N];

struct tu
{
	int x;
	int t;
}s[M];

inline int max(const int a, const int b)
{
	return a > b ? a : b;
}

int compare(const void *a, const void *b)
{
	struct tu *t1 = (struct tu *)a;
	struct tu *t2 = (struct tu *)b;
	return t1->t - t2->t;
}

void main()
{
	int n;
	int i,j,k;
	int nMax;
	int now;

	while(scanf("%d", &n))
	{
		if(!n)
			break;

		for(i = 0; i < n; ++i)
		{
			scanf("%d %d", &s[i].x, &s[i].t);
		}

		qsort(s,n,sizeof(s[0]),compare);
		memset(dp,0,sizeof(dp));

		k = 0;
		nMax = 0;
		now = 0;
		for(j = 1; k < n; ++j)
		{
			now ^= 1;
			//dp[i]更新成上一个时刻的最大值
			for(i = 1; i <= 11; ++i)
			{
				dp[now][i] = max(dp[now^1][i], dp[now^1][i - 1]);
				dp[now][i] = max(dp[now][i], dp[now^1][i + 1]);
				nMax = max(nMax,dp[now][i]);
			}
			//加上这一时刻该点掉下来的馅饼
			for(; s[k].t == j; ++k)
			{
				if(j == 1 && (s[k].x < 4 || s[k].x > 6))
				{
					continue;
				}
				dp[now][s[k].x+1] += 1;
				nMax = max(nMax,dp[now][s[k].x+1]);
			}	
		}
		printf("%d\n", nMax);
	}
}


你可能感兴趣的:(HDU1176——免费馅饼)