zoukankan      html  css  js  c++  java
  • poj2184

    题意:给定一些奶牛,每个牛有s和f两个属性值,有正有负,要求选出一些牛,使得这些牛的两种属性的和的加和最大,且这些牛的两种属性分别求加和不能为负。

    分析:dp,开始想到dp[i][s][f],表示前i头牛能否实现属性和分别为s,f。空间和时间都不允许,要将f从状态中拿出來,让f的属性和作为所求的值。即变为d[i][s]=f的形式。表示用前i头牛构成s属性和为s的情况下f属性和最大为多少。状态转移从两种情况来,即用或者不用当前的牛。dp[i][j] = max(dp[i - 1][j - s[i]] + f[i], dp[i - 1][j])。在实际操作的时候可以将第一维去掉,进行空间上的优化。但是由于s[i]的值有正有负,所以在填写数组的顺序要根据s[i]的值来决定,若为正则从右到左(类似01背包的空间优化),若为负则从左到右。

    注意:动态规划中状态维和值是可以相互转化的。状态维过多,效率低的时候,可以把将其转化为数组值;同理,数组值不唯一无法规划时,可以增加状态维使状态更详细。

    View Code
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    
    #define maxn 105
    #define maxs 2000 * 100
    #define shift 1000 * 100
    #define inf 0x3f3f3f3f
    
    int n, s[maxn], f[maxn];
    int dp[maxs];
    
    void input()
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%d%d", &s[i], &f[i]);
    }
    
    void work()
    {
        for (int i = 0; i < maxs; i++)
            dp[i] = -inf;
        dp[0 + shift] = 0;
        int l = 0, r = 0;
        for (int i = 0; i < n; i++)
        {
            l = min(l, l + s[i]);
            r = max(r, r + s[i]);
            int step = 1;
            int begin = l, end = r;
            if (s[i] > 0)
            {
                step = -1;
                swap(begin, end);
            }
            for (int j = begin; j != end + step; j += step)
            {
                dp[j + shift] = max(dp[j - s[i] + shift] + f[i], dp[j + shift]);
    //            printf("%d %d\n", j, dp[j + shift]);
            }
        }
        int ans = 0;
        for (int i = 0; i <= r; i++)
            if (dp[i + shift] >= 0)
                ans = max(ans, i + dp[i + shift]);
        printf("%d\n", ans);
    }
    
    int main()
    {
        //freopen("t.txt", "r", stdin);
        input();
        work();
        return 0;
    }
  • 相关阅读:
    百度网盘下载速度慢的问题解决
    问题汇总
    centos 遇到Name or service not known
    centos7 下 python3 和python2 同时存在但是无法使用pip3 的解决方案
    pycharm2020(最简单的方法)配置远程连接服务器
    pycharm2020.1.2激活
    centos安装成功bart标注工具
    keras遇到bert实战一(bert实现分类)
    使用Array.slice(0) 实现数组浅拷贝
    try/catch/finally 语句
  • 原文地址:https://www.cnblogs.com/rainydays/p/2576077.html
Copyright © 2011-2022 走看看