hdu 1176 免费馅饼 (数塔)

来源:互联网 发布:肯德基 网络市场调研 编辑:程序博客网 时间:2024/05/29 18:05

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


解题报告:如果以下落的时间为纵轴,以移动的横线为横轴,则可以把改问题抽象为数塔问题,只不过该数塔只有5层剩下的是一个矩形


更新的时候注意范围,这里我把三角形的外侧赋值为-1,就是在这片区域不能被更新

代码有点乱


code:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int maxn,a[100005][11];int n,x,T;int max1(int a,int b,int c){if(a<b)a=b;if(a<c) a=c;return a;}int main(){while(scanf("%d",&n)&&n){maxn=-1;memset(a,0,sizeof(a));for(int i=0;i<n;i++){scanf("%d %d",&x,&T);++a[T][x];if(T>maxn)maxn=T;}a[0][5]=0;for(int i=0;i<5;i++)for(int j=0;j<5-i;j++)a[i][j]=a[i][10-j]=-1;for(int i=1;i<=maxn;i++){for(int j=0;j<=10;j++){if(j>0&&j<10&&a[i][j]!=-1&&(a[i-1][j-1]!=-1||a[i-1][j]!=-1||a[i-1][j+1]!=-1))a[i][j]=max1(a[i-1][j-1],a[i-1][j],a[i-1][j+1])+a[i][j];else if(j==0&&a[i][j]!=-1&&(a[i-1][j]!=-1||a[i-1][j+1]!=-1))a[i][j]=max(a[i-1][j],a[i-1][j+1])+a[i][j];else if(j==10&&a[i][j]!=-1&&(a[i-1][j]!=-1||a[i-1][j-1]!=-1))a[i][j]=max(a[i-1][j],a[i-1][j-1])+a[i][j];}}int ans=-1;for(int i=0;i<=10;i++)if(a[maxn][i]>ans)ans=a[maxn][i];printf("%d\n",ans);}return 0;} 


原创粉丝点击