POJ-2609-双塔dp
来源:互联网 发布:安纳金·天行者知乎 编辑:程序博客网 时间:2024/06/06 12:58
题目大意:有n辆汽车需要运载到船上,船上有两块甲板A,B,长度都是L,n辆汽车必须一次上去,问最多能运几辆车。
题目解析:先预处理前缀和,定义dp[i][j],表示前i辆车,A甲板用的长度为j能否满足条件,这样状态转移的时候只需要考虑他能否被运到A或者B上了。
AC代码:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,len,a[510],dp[510][10010],pre[510][10010],sum[510];void dis(int x,int y){ if(x<=0) return ; if(pre[x][y]==1) { dis(x-1,y-a[x]); printf("port\n"); } else { dis(x-1,y); printf("starboard\n"); }}int main(){ while(scanf("%d",&len)!=EOF) { len*=100; n=1; while(scanf("%d",&a[n])&&a[n]) { n++; } n--; sum[0]=0; for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i]; memset(dp,0,sizeof(dp)); memset(pre,-1,sizeof(pre)); dp[0][0]=1; int ans=0,tar; for(int i=1;i<=n;i++) { for(int j=len;j>=0;j--) { if(sum[i-1]-j>len) break; if(sum[i]-j<=len) { if(j-a[i]>=0) dp[i][j]=dp[i-1][j]|dp[i-1][j-a[i]]; else dp[i][j]=dp[i-1][j]; if(dp[i-1][j]) pre[i][j]=0; else if(j-a[i]>=0&&dp[i-1][j-a[i]]) pre[i][j]=1; } else if(j-a[i]>=0) { dp[i][j]=dp[i-1][j-a[i]]; pre[i][j]=1; } if(dp[i][j]) { ans=i; tar=j; } } if(ans!=i) break; } printf("%d\n",ans); if(ans) dis(ans,tar); } return 0;}
0 0
- POJ-2609-双塔dp
- POJ 2609 Ferry Loading 双塔DP
- POJ 2609 Ferry Loading(双塔DP)
- poj dp
- 【dp】POJ
- 【dp】POJ
- [DP] POJ
- [DP] POJ
- [DP] POJ
- 【dp】POJ
- POJ 1015 Jury Compromise 双塔DP
- POJ 1015 Jury Compromise(双塔DP)
- 期望DP入门(POJ 1190 ,POJ 2609)
- POJ 3670 && POJ 3671 (dp)
- 【DP】 POJ 1080
- poj 1163经典DP
- poj 1088 滑雪(DP)
- poj 1770 树形dp
- java客户端向服务器发送数据
- KMP算法的Next数组详解
- 信息安全基础--加解密和数字签名
- Rigidbody
- YAHOO 35条前端优化建议
- POJ-2609-双塔dp
- 像"机器"一样思考
- 导入兼容包
- 向量空间模型(VSM)在文档相似度计算上的简单介绍
- A+B Problem II
- 素数判定(筛选 突破常规)
- webStorm设置颜色和字体大小
- 机器学习并没有那么深奥,它很有趣(2)
- SpringMvc对Servlet原生API的支持