• dp


    题目描述:

     

     

     

     

     AC代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=10005,maxm=1005;
    int n,m,p;
    int clic[maxn],uncl[maxn],L[maxn],H[maxn];
    int f[maxn][maxm],cnt,INF;
    inline int read()
    {
        int x = 0; 
        char ch = getchar();
        while(ch < '0' || ch > '9') 
            ch = getchar();
        while(ch >= '0' && ch <= '9') 
        {
            x = x * 10 + ch - '0';
            ch = getchar();
        }
        return x;
    }
    
    int main()
    {
        n = read();
        m = read();
        p = read();
        for(int i = 1;i <= n;i++) 
        {
            clic[i] = read();
            uncl[i] = read();
        }
        for(int i = 1;i <= n;i++) 
        {
            L[i] = 0;
            H[i] = m + 1;
        }
        for(int i = 1;i <= p;i++)
        {
            int x = read();
            L[x] = read();
            H[x] = read();
        }
        memset(f,63,sizeof(f));
        INF = f[0][0];
        cnt = 0;
        for(int i = 0;i <= m;i++)
            f[0][i] = 0;
        for(int i = 1;i <= n;i++)
        {
            for(int j = 1;j < H[i];j++) 
                if(j >= clic[i] && j != m)
                    f[i][j] = min(f[i][j],min(f[i - 1][j - clic[i]] + 1,f[i][j - clic[i]] + 1));
            for(int j = 1;j < H[i];j++) 
                if(j + uncl[i] <= m && j >= L[i] + 1)
                    f[i][j] = min(f[i][j],f[i - 1][j + uncl[i]]);
                if(H[i] == m + 1)
                    for(int j = m;j >= max(1,m - clic[i]);j--) 
                        f[i][m] = min(f[i][m],min(f[i - 1][j] + 1,f[i][j] + 1));
            bool flythr = 0;
            for(int j = L[i] + 1;j < H[i];j++) 
                if(f[i][j] < INF)
                {
                    flythr=1; 
                    break;
                }
            for(int j = 0;j <= L[i];j++) 
                f[i][j] = INF;
            if(!flythr)
            {
                printf("0
    %d",cnt);
                return 0;
            }
            if(L[i] > 0 || H[i] < m) 
                cnt++;
        }
        int ans = 1 << 30;
        for(int i = 1;i <= m;i++) 
            ans = min(ans,f[n][i]);
        printf("1
    %d",ans);
        return 0;
    }

    dpdpdp!!!

  • 相关阅读:
    DP--HDU 1003求数字串中的最大连续序列(含有DP过程详细分析)
    递归+DFS--简单迷宫问题--百练2802
    枚举--百练2812--恼人的青蛙(内含枚举基本思想总结)
    计蒜客:最大子阵
    hdu 4515 小Q系列故事——世界上最遥远的距离
    日期计算
    最大最小公倍数
    hdu 1568 Fibonacci
    矩阵快速幂
    矩阵乘法
  • 原文地址:https://www.cnblogs.com/biaobiao88/p/12105230.html
Copyright © 2020-2023  润新知