题意:
中文题意不解释……
思路:
先把x,T存到矩阵里 然后像数塔一样从最底层走一边就行了
dp[i][j]代表在时间为j时 第i个位置最多能吃到多少个馅饼
最后输出第0时刻的5位置的馅饼数量就好了
1 /* *********************************************** 2 Author :Sun Yuefeng 3 Created Time :2016/11/8 18:56:49 4 File Name :dp.cpp 5 ************************************************ */ 6 7 #include<cstdio> 8 #include<iostream> 9 #include<algorithm> 10 #include<cmath> 11 #include<cstring> 12 #include<string> 13 #include<bitset> 14 #include<map> 15 #include<set> 16 #include<stack> 17 #include<vector> 18 #include<queue> 19 #include<list> 20 #define M(a,b) memset(a,b,sizeof(a)) 21 using namespace std; 22 typedef long long ll; 23 const int inf=0x3f3f3f3f; 24 const int maxn=2e5+10; 25 const int mod=1e7+7; 26 int dx[8]= {0,0,1,-1,1,-1,1,-1}; 27 int dy[8]= {1,-1,0,0,-1,1,1,-1}; 28 29 int dp[15][maxn]; 30 31 int main() 32 { 33 //freopen("in.txt","r",stdin); 34 //freopen("out.txt","w",stdout); 35 int n; 36 while(~scanf("%d",&n)&&n) 37 { 38 M(dp,0); //初始化矩阵 39 int maxtime=-1,x,T; 40 for(int i=0;i<n;i++) 41 { 42 scanf("%d%d",&x,&T); 43 if(T>maxtime) maxtime=T; //记录最长时间 44 dp[x][T]++; //T时刻x位置的馅饼+1 45 } 46 for(int i=maxtime;i>=1;i--) 47 { 48 dp[0][i-1]+=max(dp[1][i],dp[0][i]); //边界特殊处理 49 dp[10][i-1]+=max(dp[10][i],dp[9][i]); 50 for(int j=1;j<=9;j++) 51 { //动态方程 52 dp[j][i-1]+=max(dp[j-1][i],max(dp[j][i],dp[j+1][i])); 53 } 54 } 55 printf("%d\n",dp[5][0]); 56 } 57 return 0; 58 }