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

被折叠的 条评论
为什么被折叠?



