https://vjudge.net/contest/170788#problem/G
看来我也只会写这种基础的dp了qwq
中文题意。
直接递推。
dp[i][j]为i秒j位置的最优解。
而在i秒j位置总共就这几种来源。。找一个最大的。
注意,开始没有注意起始位置,wa了两发。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e5+5;
int mp[maxn][12];
int dp[maxn][12];
int main()
{ int t;
int a,b;
while(~scanf("%d",&t)){
if(!t) break;
memset(mp,0,sizeof(mp));
int bb=-1;
for(int i=0;i<t;i++){
scanf("%d%d",&a,&b);
mp[b][a]+=1;
bb=max(b,bb);
}
memset(dp,0,sizeof(dp));
dp[1][5]=mp[1][5];
dp[1][4]=mp[1][4];
dp[1][6]=mp[1][6];
for(int i=2;i<=bb;i++){
for(int j=0;j<=10;j++){
if(j>0)
dp[i][j]=max(dp[i-1][j-1],dp[i][j]);
if(j<10)
dp[i][j]=max(dp[i-1][j+1],dp[i][j]);
dp[i][j]=max(dp[i-1][j],dp[i][j]);
dp[i][j]+=mp[i][j];
}
}
int ans=-1;
for(int i=0;i<=10;i++)
ans=max(ans,dp[bb][i]);
printf("%d\n",ans);
}
return 0;
}