终于对dp有点感觉了,但是还是没找出该题的状态转移方程。
总结: 要把题目转换成dp 的类型,然后再找到状态转移方程,还要注意边界条件。
题目大意: 自己看。
解题思路: dp 倒着dp更方便。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[110000][11],fuck[110000][11];
int main()
{
int i,j,n,x,t,maxt=0;
while(scanf("%d",&n)!=EOF&&n!=0)
{
memset(dp,0,sizeof(dp));
memset(fuck,0,sizeof(fuck));
for(i=0; i<n; i++)
{
scanf("%d%d",&x,&t);
fuck[t][x]+=1;
if(t>maxt)
maxt=t;
}
for(i=maxt; i>=0; i--)
{
for(j=0; j<=10; j++)
{
if(j==0)
dp[i][j]=max(dp[i+1][j+1],dp[i+1][j])+fuck[i][j];
else if(j==10)
dp[i][j]=max(dp[i+1][j-1],dp[i+1][j])+fuck[i][j];
else
dp[i][j]=max(dp[i+1][j],max(dp[i+1][j+1],dp[i+1][j-1]))+fuck[i][j];
}
}
printf("%d\n",dp[0][5]);
}
return 0;
}