题目可以转化为: ,每一个人的回答都可以确定他是处于队列的哪个区间, 有一个简化版的问题:在一个数轴上最多有多少个不相交的区间, 而这一题的每个区间还容纳不同的人数, 求不相连的区间的人数和最大 。
扫一遍dp就过了;
值得注意的是, 每个区间人数不能超过它的长度:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define M 1010
using namespace std;
struct Node
{
int x, y;
bool operator < ( const Node &a ) const
{
return y < a.y;
}
}node[M];
int num[M][M];
int dp[M];
int main()
{
int n, m;
int a, b, x, y;
while( scanf( "%d", &n ) == 1 ){
m = 0;
memset( num, 0, sizeof(num) );
for( int i = 0; i < n; i++ ){
scanf( "%d%d", &a, &b );
if( a + b >= n )
continue;
if( num[a+1][n-b] == 0 ){
node[m].x = a + 1;
node[m++].y = n - b;
}
num[a+1][n-b]++;
if( num[a+1][n-b] > n-a-b )
num[a+1][n-b] = n-a-b;
}
sort( node, node + m );
memset( dp, 0, sizeof(dp) );
int j = 0;
for( int i = node[0].y; i <= node[m-1].y; i++ ){
dp[i] = dp[i-1];
while( node[j].y == i ){
if( dp[i] < dp[node[j].x-1] + num[node[j].x][node[j].y] )
dp[i] = dp[node[j].x-1] + num[node[j].x][node[j].y];
j++;
}
}
if( m > 0 )
printf( "%d\n", dp[node[m-1].y] );
else
printf( "0\n" );
}
}