hdu 1176 免费馅饼

本文解析了HDU 1176免费馅饼问题,采用DP方法解决,通过构建二维数组存储状态,将问题转化为数字三角形模式,并给出AC代码。

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

dp(类数字三角形)

题目分析:将所有状态存下来,存成一个二维数组(一维时间,另一维是馅饼的位置),然后问题就转换成数字三角形的经典模式了。

code:

#include<stdio.h>
#include<string.h>
int a[100001][12];
int max(int a,int b,int c)
{
	if(a>=b&&a>=c)return a;
	if(b>=c&&b>=a)return b;
	else return c;
}
int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	int i,j,n,t,p,maxt,m;
	while(scanf("%d",&n),n)
	{
		m=maxt=0;
		memset(a,0,sizeof(a));
		for(i=0;i<n;i++)
		{
			scanf("%d %d",&p,&t);
			a[t][p]++;
			maxt=maxt>t?maxt:t;
		}
		for(i=1;i<=maxt;i++)
			for(j=1;j<=11;j++)
			{
				a[i][j]+=max(a[i-1][j-1],a[i-1][j],a[i-1][j+1]);
			}
		for(i=0;i<12;i++)
		m=max(a[maxt][i],m);
		printf("%d\n",m);
	}
}
PS:遇见一个小小的有意思的坑跌之处,code中的dp数组a[100001][12]是个一百多万的空间,开在main里确实就存不下了,但放在外部居然就能完好的存下,这是怎么个情况!?

PSS:昨天有些没素质的闲者刷hdu的第一千万提交,害OJ崩了,一晚上看不了结果,所以导致上面的代码还是wrong,今早来改了几个小问题(由于代码又是参考人家的T.T||必然是有地方没有理解透,跟人家的思路又有不同,所以不全部照搬,导致有些不真正理解的地方没改过来,还是错的),下面附上A了的code:

#include<stdio.h>
#include<string.h>
int a[100001][12];
int max(int a,int b,int c)
{
    if(a>=b&&a>=c)return a;
    if(b>=c&&b>=a)return b;
    else return c;
}
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int i,j,n,t,p,maxt,m;
    while(scanf("%d",&n),n)
    {
        m=maxt=0;
        memset(a,0,sizeof(a));
        for(i=0;i<n;i++)
        {
            scanf("%d %d",&p,&t);
            a[t][p]++;
            maxt=maxt>t?maxt:t;
        }
        for(i=maxt-1;i>=0;i--)//时间必须从后往前遍历,因为结果需要一个第五位置,而这个第五位置是0时刻的第五位置
            for(j=0;j<11;j++)
                a[i][j]+=max(a[i+1][j-1],a[i+1][j],a[i+1][j+1]);
        printf("%d\n",a[0][5]);
    }
}

PS:C不支持重载函数,C++行;

PSS:参考的这一篇http://blog.csdn.net/xcszbdnl/article/details/7876283






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值