HDU 1176 免费馅饼
这道题,把馅饼掉落看作以时间和坐标为i,j的二维数组。
然后就类似数塔问题。可以用类似DP解决问题。
一开始我还在纠结那个读入数塔三角形。这样做就超时了。。。
后来发现真是脑残,因为其实他的长度只有11,就直接倒着遍历一次就可以解决了。
#include<stdio.h>
#include<iostream>
using namespace std;
int a[100010][12];
int b[100010][12];
int max(int a,int b,int c)
{
int x;
x=a;
if(b>x)
x=b;
if(c>x)
x=c;
return x;
}
int main()
{
int T,n,i,j,x,y,k,maxx;
while(cin>>n)
{
maxx=-1;
memset(a,0,sizeof(a));
if(n==0)
break;
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
a[y][x]++;
if(maxx<y)
maxx=y;
}
//b[0][0]=a[0][5];
/*
for(i=1;i<n;i++)
{
for(j=0;j<i*2-1;j++)
{
for(k=0;k<3;k++)
{
b[i][j]=a[i][5-i+j];
b[i][j+1]=a[i][5-i+j+1];
b[i][j+2]=a[i][5-i+j+2];
}
}
}
*/
for(i=maxx-1;i>=0;i--)
{
a[i][0]+=max(0,a[i+1][0],a[i+1][1]);
for(j=1;j<10;j++)
a[i][j]+=max(a[i+1][j-1],a[i+1][j],a[i+1][j+1]);
a[i][10]+=max(a[i+1][9],a[i+1][10],0);
}
/* for(i=n-1;i>=0;i--)
{
for(j=0;j<i*2-1;j++)
{
b[i-1][j]=max(b[i-1][j]+b[i][j],b[i-1][j]+b[i][j+1],b[i-1][j]+b[i][j+2]);
}
}
*/
printf("%d\n",a[0][5]);
}
return 0;
}
注释掉得部分是脑残的部分。。
在TLE之后我也是看了大神的代码才发现自己脑残了。。