hdu1176
http://acm.hdu.edu.cn/showproblem.php?pid=1176
经典动规模型数塔的变形,将馅饼落下的位置看做数塔中的列数,而将下落时间看做数塔中的行数,问题转化为求解从塔底到塔顶的最长路径。
从此题中可以看出数塔模型的每一个节点都有两个属性:行数和列数,碰到类似有两个属性的动规时可以考虑。
ps:此题可以向下走三个方向。
1 #include<stdio.h>
2 #include<memory.h>
3 int sum[100001][13];
4 #define maxer(a,b) ((a)>(b)?(a):(b))
5 int max(int a,int b,int c)
6 {
7 return maxer(a,b)>maxer(b,c)?maxer(a,b):maxer(b,c);
8 }
9 int main()
10 {
11 int num;
12 while(scanf("%d",&num)==1&&num)
13 {
14 memset(sum,0,sizeof(sum));
15 int a,b,maxsec=0;
16 for(int i=0;i<num;i++)
17 {
18 scanf("%d %d",&a,&b);
19 sum[b][a+1]++;
20 maxsec=maxsec>b?maxsec:b;
21 }
22 for(int i=maxsec-1;i>=0;i--)
23 for(int j=11;j>=1;j--)
24 sum[i][j]+=max(sum[i+1][j],sum[i+1][j-1],sum[i+1][j+1]); //从三个方向中寻找权值最大的方向
25 printf("%d\n",sum[0][6]);
26 }
27 return 0;
28 }