题目链接:http://icpc.moe/onlinejudge/showProblem.do?problemCode=3331
题意:给两个机器,然后很多个操作,分别给出对应操作在AB两个机器上运作的时间,限定该操作能执行的条件是,前一个操作已完成或正在执行.
http://blog.csdn.net/loy_184548/article/details/50733395
第一次接触双塔dp代码是别人教的。
说真的自己到现在还看不怎么懂。还需要多多努力,但是先保留下来以后自己慢慢补。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int dp[105][200];//前i个任务,两个机器的时差,也就是双塔高度差a-b
int ta[105],tb[105];
int n,t;
int main()
{
cin>>t;
while(t--)
{
int offset=100;
//因为差值可能是负数,因此需要加一个偏移量保证差值为正数
cin>>n;
for(int i=1;i<=n;i++)
cin>>ta[i]>>tb[i];
for(int i=0;i<=n;i++)
for(int j=0;j<=200;j++)
dp[i][j]=inf;
dp[0][0+offset]=0;
for(int i=1;i<=n;i++){
for(int j=-99;j<=99;j++){
if(dp[i-1][j+offset]==inf)
continue;
if(j<0){//B塔较高
dp[i][-tb[i]+offset]=min(dp[i][-tb[i]+offset],dp[i-1][j+offset]+tb[i]);
dp[i][j + ta[i] + offset] = min(dp[i][j + ta[i] + offset],dp[i - 1][j + offset] + max(0,j + ta[i]));
}
else //A塔较高 同理
{
dp[i][ta[i] + offset] = min(dp[i][ta[i] + offset], dp[i - 1][j + offset] + ta[i]);
dp[i][j - tb[i] + offset] = min(dp[i][j - tb[i] + offset], dp[i - 1][j + offset] + max(0,tb[i] - j));
}
}
}
int ans = inf;
for (int i = -99; i <= 99; i++)
ans = min(dp[n][i + offset],ans);
cout << ans << endl;
}
return 0;
}