题目:
6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
想法:想了老长时间也没个思路,于是搜了一下,参照了“搁浅の记忆”的,看了一下如下的图,突然明白了,直接把图贴这里了。。
5 i = 0;
5 6 7 i = 1;
4 5 6 7 8 i = 2;
3 4 5 6 7 8 9 i = 3;
2 3 4 5 6 7 8 9 10 i = 4;
1 2 3 4 5 6 7 8 9 10 11 i = 5;
1 2 3 4 5 6 7 8 9 10 11 i = 6;
。。。。。。。。。。。。 。。。
dp方程:
dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j+1]),dp[i+1][j])
然后为啥用cin会超时而用scanf不会超时的原因可以参考下这位大神的。。
http://blog.csdn.net/lttree/article/details/14005697
代码:
#include<stdio.h>
#include <iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int INF=0x3f3f3f3f;
int dp[100010][20];
int main()
{
int n,i,j,M,x,T;
while(scanf("%d",&n),n)
{
memset(dp,0,sizeof(dp));
M=-INF;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&T);
M=max(M,T);
dp[T][x+1]++;
}
for(i=M;i>=0;i--)
{
for(j=1;j<=11;j++)
dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j+1]),dp[i+1][j]);
}
printf("%d\n", dp[0][6]);
}
return 0;
}