poj 2609 双塔DP-输出路径-用前缀和压缩状态

题目链接:http://poj.org/problem?id=2609
题目大意:有一个长度为m的两个车厢。有一排车,必须按顺序驶入车厢(左右任选)但是不能超过m长度。问最多装多少。如果第i辆车装不下,那么后面的车都不能再装。
图片说明
思路:用f[i][j][k]:表示前i辆车左车厢长度为j,右车厢长度为k的状态是否存在。因为j+k==sum[i]。所以可以降一维。

#include  <map>
#include  <set>
#include  <cmath>
#include  <queue>
#include  <cstdio>
#include  <vector>
#include  <climits>
#include  <cstring>
#include  <cstdlib>
#include  <iostream>
#include  <algorithm>
using namespace std;

int f[510][15010], g[510][15010];
int a[510], sum[510];
int main() {

    int m; scanf("%d", &m);
    m*=100;
    int n=0, x;
    while(1){
        scanf("%d", &x);
        if(x==0){
            break;
        }
        a[++n]=x;
    }
    for(int i=1; i<=n; i++){
        sum[i]=sum[i-1]+a[i];
    }
    f[0][0]=1;
    int mx=0, sx=0;
    for(int i=0; i<n; i++){
        for(int s=0; s<=15000; s++){
            if(f[i][s]){

                int L=s, R=sum[i]-L;
                if(L+a[i+1]<=m){
                    f[i+1][L+a[i+1]]=1;
                    g[i+1][L+a[i+1]]=1;
                    mx=i+1, sx=L+a[i+1];
                }
                if(R+a[i+1]<=m){
                    f[i+1][L]=1;
                    g[i+1][L]=2;
                    mx=i+1, sx=L;
                }
               //cout<<i<<" "<<s<<endl;
            }
        }
    }
    printf("%d\n", mx);
    vector<char*> ans;
    while(mx){
        if(g[mx][sx]==1){
            ans.push_back("port");
            sx-=a[mx];
            mx--;
        }
        else{
            ans.push_back("starboard");
            mx--;
        }
    }
    for(int i=ans.size()-1; i>=0; i--){
        printf("%s\n", ans[i]);
    }

    return 0;
}
全部评论

相关推荐

吾族血脉,自吾始立铁律:凡我子孙,胆敢研习计算机之术者,当受七窍流血之刑!若见Python之书,必遭雷殛;若触Java代码,定为不孝!键盘鼠标准入族谱秽物录,显示器乃摄魂邪镜祖祠前当立戒碑:"二进制者,断子绝孙之道也!"算法者,乱我族心智之毒也!数据结构,毁我门风之刃也!倘有逆子偷装&nbsp;vscode,即按祖规捆于祠堂梁柱,令其DEBUG至死不得解脱!今颁天条三则:壹)三代血亲不得报考计算机系违者削去辈分,永世称码奴贰)族中幼童须背《戒算经》"if-else咒,switch符,皆是断头术"叁)凡见子侄讨论编程者须即刻砸其电脑,焚其书籍泼黑狗血于键盘之上!太祖母口谕:"吾宁要文盲孙,不要程序员!"尔...
好吃的薯饼:姐妹这不是我们计算机系吧,我们计算机系的都在言情小说里当黑客大佬,各种竞赛拿奖拿到手软,公司系统道路监控随便入侵。身体线条非常优美,挺拔的站姿十分端正,给人以强壮有内涵的感觉。脸庞轮廓深刻,五官分明透露着对太阳底下最光辉的职业的向往和坚定,尤其是那双深邃的眼睛,写满了对代码和计算机系统的热情和无限的活力。我们计算机系是天之骄子、明日之星,人手一个博士学位不然高中电脑老师都当不上。组会的时候,面对导师和同事的疑难问题,也能够回答自如。我们总是把高高的发际线当做荣耀的象征。妈咪这不素我们计算机系吧,集美集帅怎么只会写hello world?
点赞 评论 收藏
分享
03-30 19:30
石家庄学院 Java
野蛮的柯基在游泳:都能入股了,还得是Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务