65 14 16 17 27 28 30Sample Output4思路:将时间t看做行,将位置x看做列,然后从最后时间向上计算;每个时间每个位置有三种状态dp[t][x]=max(dp[t+1][x],dp[t+1][x+1],dp[t+1][x-1]);AC代码如下:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1e5+10;int dp[maxn][10+2];int main(){ int n; while(scanf("%d",&n)==1 && n){ memset(dp,0,sizeof(dp)); int time=0; for(int i=0;i<n;i++){ int x,T; scanf("%d%d",&x,&T); dp[T][x+1]++; //位置向后挪一尾 time=max(time,T); } for(int t=time-1;t>=0;t--){ for(int x=1;x<=11;x++){ dp[t][x]+=max(dp[t+1][x],max(dp[t+1][x-1],dp[t+1][x+1])); } } PRintf("%d/n",dp[0][6]); } return 0;}
新闻热点
疑难解答