HDU-5543 DP

来源:互联网 发布:淘宝动态评分能改吗 编辑:程序博客网 时间:2024/06/06 09:12

题目

Pick The Sticks

题解

01背包的加强版,由于两端可以放置 length/2 长度的木棍,所以加一维长度为3的状态,分别表示两端不放木棍,只有一端放木棍,两端都放木棍。

代码

#include <algorithm>#include <bitset>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <climits>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <vector>using namespace std;const int MAX= 1005;const int MAXN = 4005;int len[MAX];long long value[MAX];long long dp[MAXN][3];int main(){    int T;    cin >> T;    for(int t=1;t<=T;++t){        memset(dp,0,sizeof(dp));        int n,l;        cin >> n >> l;        l *= 2;        long long mx = 0;        for (int i = 0; i < n; ++i) {            scanf("%d %lld",len + i, value + i);            len[i] *= 2;            mx = max(mx, value[i]);        }        for (int i = 0; i < n; ++i){            for (int j = l; j >= len[i]/2; --j) {                for(int k=0;k<3;++k){                    if(j >= len[i])                        dp[j][k] = max(dp[j][k], dp[j - len[i]][k] + value[i]);                    if(k > 0)                        dp[j][k] = max(dp[j][k], dp[j - len[i] / 2][k-1] + value[i]);                    mx = max(mx, dp[j][k]);                }            }        }        cout << "Case #" << t << ": " << mx << endl;    }    return 0;}
原创粉丝点击