不带滚动数组版:

#include <cstdio>
#include <algorithm>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int t, n, m, k, l, r, a[2018], dp[2018][2018];
int main() {
scanf("%d", &t);
rep(ks,1,t) {
scanf("%d%d%d", &n, &m, &k);
rep(i,1,n) a[i] = i + 1;
rep(i,1,m) { scanf("%d%d", &l, &r); rep(j,l,r) a[j] = min(a[j], l); }
rep(i,0,n) rep(j,0,k) dp[i][j] = 0;
rep(i,1,n) rep(j,1,k) {
dp[i][j] = dp[i-1][j];
dp[i][j] = max(dp[i][j], dp[a[i]-1][j-1] + i-a[i]+1);
}
printf("Case #%d: %d\n", ks, dp[n][k]);
}
return 0;
}

带滚动数组版:

#include <cstdio>
#include <algorithm>
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define pre(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
int t, n, m, k, l, r, a[2018], dp[2018];
int main() {
scanf("%d", &t);
rep(ks,1,t) {
scanf("%d%d%d", &n, &m, &k);
rep(i,1,n) a[i] = i + 1, dp[i] = 0;
rep(i,1,m) { scanf("%d%d", &l, &r); rep(j,l,r) a[j] = min(a[j], l); }
rep(i,1,k) {
pre(j,n,1) dp[j] = max(dp[j], dp[a[j]-1]+j-a[j]+1);
rep(j,1,n) dp[j] = max(dp[j], dp[j-1]);
}
printf("Case #%d: %d\n", ks, dp[n]);
}
return 0;
}