模型挺好的dp题,其实这道题就是建一个模型然后就很容易想到递推过程了,我们可以把每个人的描述,存到数组a中,a[l][r]表示左边有l个,到第r个这个人所在一层停止。。。然后就可以写出转移状态方程了。注意如果dp[i]>dp[j] && i < j 则需要把dp[j]更新为dp[i]。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define LL long long #define CLR(a, b) memset(a, b, sizeof(a)) using namespace std; const int N = 555; int a[N][N], dp[N]; int main() { //freopen("input.txt", "r", stdin); int n, i, j, l, r; while(scanf("%d", &n) != EOF) { CLR(a, 0); CLR(dp, 0); for(i = 0; i < n; i ++) { scanf("%d%d", &l, &r); a[l][n - r] ++; } for(i = 0; i < n; i ++) { for(j = n - i - 1; j >= 0; j --) { dp[n - j] = max(dp[n - j], dp[i] + min(n - j - i, a[i][n - j])); dp[n - j] = max(dp[n - j], dp[n - j - 1]); } } printf("%d\n", dp[n]); } }