HDU 4293 Groups

       模型挺好的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
", dp[n]);
    }
}


原文地址:https://www.cnblogs.com/james1207/p/3306314.html