哎,一开始没看到从5开始....
后来写懵了,用了queue正推,记录能到达的节点,p[i+1][j] = max(p[i][j],max(p[i][j-1],p[i][j+1]))
嗯,用stl mle了,自己写queue又tle,不知道为什么嚒,好像bfs我从没a过...
看了dicuss的思路,只看到数塔两个字我就懂了...
只能说巧妙了,区间反向确定我确实没想到...
//数塔问题 /* t=0 5 t=1 456 t=2 34567 t=3 2345678 t=4 123456789 t=5 0123456789A */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> const int MAXN= 1e5+10; using namespace std; int dp[MAXN][12]; int mov[3]={-1,0,1}; /*bool isOverBorder(int x){ if(x<0||x>10)return true; else return false; }*/ void init(){ for(int i=0;i<MAXN;i++){ for(int j=0;j<11;j++){ dp[i][j] = 0; } } } int main() { int n; while(scanf("%d",&n),n){ int t,p; int maxt = -MAXN; init(); for(int i=0;i<n;i++){ scanf("%d%d",&p,&t); dp[t][p] += 1; maxt = max(maxt,t); } for(int i=maxt-1;i>=0;i--){ dp[i][0] += max(dp[i+1][0],dp[i+1][1]); for(int j=1;j<11;j++){ dp[i][j] += max(dp[i+1][j],max(dp[i+1][j+1],dp[i+1][j-1])); } } cout<<dp[0][5]<<endl; } return 0; }