ZJU 3331 神奇的双塔DP
来源:互联网 发布:决战武林进阶数据大全 编辑:程序博客网 时间:2024/06/05 16:30
大致题意:
有两个机器a,b。要处理n个部件,第i个部件在机器a上完成需要x[i],在b机器上需要y[i],每个部件只能选择一个机器来完成。且当地i个部件开始加工时前[1,i-1]部件必须已经完成或者正在被加工。求加工完所有n个部件的最小时间是多少。
大致思路:
好神的dp,这里的状态表示非常奇怪。dp[i][j]代表的是,当加工到第i个部件,a机器比b机器的时间多出j+100时的最少时间是多少。
转移的时候就分别考虑当前任务放在a上或放在b上的最少时间分别是多少即可。
#include<iostream>#include<algorithm>#include<string.h>#include<string>#include<stdio.h>#define inf 2139062143#define M 100using namespace std;int n,x[120],y[120];int dp[210][250];int main(){int t;cin>>t;while(t--){int i,j,k;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);memset(dp,0x7f,sizeof(dp));dp[0][100]=0;for(i=0;i<n;i++){for(j=0;j<=200;j++){if(dp[i][j]==inf)continue;if(j>=100){dp[i+1][x[i+1]+M]=min(dp[i+1][x[i+1]+M],dp[i][j]+x[i+1]);dp[i+1][j-y[i+1]]=min(dp[i+1][j-y[i+1]],dp[i][j]+max(0,y[i+1]-(j-M)));}else {dp[i+1][M-y[i+1]]=min(dp[i+1][M-y[i+1]],dp[i][j]+y[i+1]);dp[i+1][j+x[i+1]]=min(dp[i+1][j+x[i+1]],dp[i][j]+max(0,x[i+1]-(M-j)));}}}int ans=inf;for(i=0;i<=200;i++)ans=min(dp[n][i],ans);printf("%d\n",ans);}return 0;}
0 0
- ZJU 3331 神奇的双塔DP
- 神奇的贪心 + DP
- dp 神奇的口袋
- Android里神奇的dp
- Android里神奇的dp
- Android里神奇的dp
- Android里神奇的dp
- Android里神奇的dp
- 【入门DP】 神奇的口袋
- poj 3612 神奇的DP
- zju 1234 Chopsticks (DP)
- zju 1013 dp
- ZJU 3469(区间DP)
- zju 2972 Hurdles of 110m(简单的DP)
- zju练习赛四 D记忆状态的dp
- hdu 4526 拼车记 神奇的dp
- [DP] OpenJudge 2755 神奇的口袋
- bzoj 1187 神奇的游乐园 | 插头dp
- 50款JavaScript图形图表库赏析(上)
- Linux下定时备份Postgresql数据库
- Eclipse启动时报错:No java virtual machine
- 小型无线模块 WizFi250 数据手册
- Java中五种界面布局类和实际中的使用
- ZJU 3331 神奇的双塔DP
- 两种运行sh文件的差异,直接文件路径名和(.+空格+文件路径名)
- Ubuntu12.04下eclipse提示框黑色背景色的修改方法
- 学习笔记 --- LINUX I2C总线驱动框架分析
- 我总是梦着,那座没有梦的城市
- java 文件路径
- iOS项目目录结构和开发流程(转载)
- mysql高级 tigger触发器 --[3]
- Numpy基础笔记