这题弄了好久才AC啊。。。太挫了。。。哎。。。以前心不静 ,不会做就看别人的代码,然后现在导致这种简单的题目细节地方一直注意的不好。。。。
思路:
dp[i][j]表示第i次刷前j个 最多的个数
然后 因为可以选择刷不刷第j个所以就有状态转移方程:
int l;
for( l = j; l >= 1; l-- ){
if( y[j] - y[l] > W ){
break;
}
}
dp[i][j] = max( dp[i][j-1], dp[i-1][l] + j - l );
其实这里可以预处理下这个l的
然后AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int cmp( const void *a, const void *b ){
return *(int*)a - *(int*)b;
}
int main(){
int T, Case = 1;
int y[101], dp[101][101];
int N, W, K;
cin >> T;
while( T-- ){
cin >> N >> W >> K;
for( int i = 1; i <= N; i++ ){
int temp1, temp2;
cin >> temp1 >> temp2;
y[i] = temp2;
}
qsort( y + 1, N, sizeof( int ), cmp );
memset( dp, 0, sizeof( dp ) );
for( int i = 1; i <= K; i++ ){
for( int j = 1; j <= N; j++ ){
int l;
for( l = j; l >= 1; l-- ){
if( y[j] - y[l] > W ){
break;
}
}
dp[i][j] = max( dp[i][j-1], dp[i-1][l] + j - l );
}
}
cout << "Case " << Case++ << ": " <<dp[K][N] << endl;
}
return 0;
}