一道dp题,dp[i][j],i表示从1~i的邮票,j表示当前set数量。训练的时候一直没有想到,不知道如何处理区间。
#include<bits/stdc++.h>
using namespace std;
int dp[2010][2010];
int main(){
int T, K, N, M, right[2010], cas=1;
scanf("%d", &T);
while(T--){
scanf("%d%d%d", &N, &M, &K);
int x, y;
memset(right, 0, sizeof(right));
memset(dp, 0, sizeof(dp));
for(int i=0; i<M; i++){
scanf("%d%d", &x, &y);
for(int j=x; j<=y; j++)
right[j]=max(right[j], y);
}
for(int i=1; i<=N; i++){
for(int j=1; j<=K; j++){
//把周围更新一下
dp[i][j]=max(dp[i-1][j], dp[i][j]);
dp[i+1][j]=max(dp[i+1][j], dp[i][j]);
dp[i][j+1]=max(dp[i][j+1], dp[i][j]);
if(right[i]){
dp[right[i]][j]=max(dp[right[i]][j], dp[i-1][j-1]+right[i]-i+1);
// printf("dp[%d][%d]=%d\n", right[i], j, dp[right[i]][j]);
}
}
}
printf("Case #%d: %d\n", cas++, dp[N][K]);
}
return 0;
}