4
动态规划的方法自底向上对每一个位置,每一秒时间求当前的最大馅饼数。
可以得出这样的数塔结构:
第0秒 5 (这里的数字指的是第N秒可能到达的位置坐标)
第1秒 4 5 6
第2秒 3 4 5 6 7
第3秒 2 3 4 5 6 7 8
第4秒 1 2 3 4 5 6 7 8 9
第5秒 0 1 2 3 4 5 6 7 8 9 10
第6秒 0 1 2 3 4 5 6 7 8 9 10
这样就可以看出怎么动态规划了,第i秒第j的位置始终存放这从此位置可得到的最大馅饼数,那么在0秒的5位置处就是最大可得到的馅饼数。
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int b[100001][12]; int main() { int t,s,i,j,x,n; while(cin>>n&&n) { s=0; memset(b,0,sizeof(b)); for(i=0; i<n; i++) { cin>>x>>t; b[t][x]++; s=max(s,t); } for(i=s-1; i>=0; i--) { for(j=1; j<10; j++) b[i][j]+=max(b[i+1][j-1],max(b[i+1][j],b[i+1][j+1])); b[i][0]+=max(b[i+1][0],b[i+1][1]); b[i][10]+=max(b[i+1][10],b[i+1][9]); } cout<<b[0][5]<<endl; } }