http://acm.hdu.edu.cn/showproblem.php?pid=1176
DP,数塔变形题。
//pie[i][j]表示在i秒在j坐标处最多能接到的馅饼数
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100001;
const int P = 12;
int pie[N][P];
int main()
{
int n;
while(scanf("%d",&n)&&n!=0)
{
int t,m,maxt=-1;
memset(pie, 0, sizeof(pie));
while(n--)
{
scanf("%d%d",&m,&t);
pie[t][m]++;
if(t>maxt)
{
maxt = t;
}
}
//dp
for(int i=maxt;i>0;i--)
for(int j=0;j<=10;j++)
{
if(j==0)
{
pie[i-1][j]+=max(pie[i][j],pie[i][j+1]);
}
else if(j==10)
{
pie[i-1][j]+=max(pie[i][j],pie[i][j-1]);
}
else
{
int temp = max(pie[i][j],pie[i][j+1]);
pie[i-1][j]+=max(temp,pie[i][j-1]);
}
}
cout<<pie[0][5]<<endl;
}
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100001;
const int P = 12;
int pie[N][P];
int main()
{
int n;
while(scanf("%d",&n)&&n!=0)
{
int t,m,maxt=-1;
memset(pie, 0, sizeof(pie));
while(n--)
{
scanf("%d%d",&m,&t);
pie[t][m]++;
if(t>maxt)
{
maxt = t;
}
}
//dp
for(int i=maxt;i>0;i--)
for(int j=0;j<=10;j++)
{
if(j==0)
{
pie[i-1][j]+=max(pie[i][j],pie[i][j+1]);
}
else if(j==10)
{
pie[i-1][j]+=max(pie[i][j],pie[i][j-1]);
}
else
{
int temp = max(pie[i][j],pie[i][j+1]);
pie[i-1][j]+=max(temp,pie[i][j-1]);
}
}
cout<<pie[0][5]<<endl;
}
return 0;
}