Landscaping S
其实是一道 USACO2012年3月月赛银组的
大水题·
题目描述
有 n n n个花坛,编号为 1 , 2 , . . . . . , n 1,2,.....,n 1,2,.....,n。现在每个花坛有 A i A_i Ai个泥土,要通过以下操作,将它们变为 B i B_i Bi个>泥土:
- 在某个花坛增加一个泥土 ,要花费 X X X。
- 在某个花坛减少一个泥土,要花费 Y Y Y.。
- 把某个花坛的泥土搬到另一个花坛里,要花费 Z ∣ i − j ∣ Z|i-j| Z∣i−j∣。
求花费最小值?
分析
我觉得这题的 d p dp dp的方法很妙
存储
乍一看,我们会直接把 a a a数组和 b b b数组的值直接存起来,像这样:
数组 | 值 | |||
---|---|---|---|---|
a | 1 | 2 | 3 | 4 |
b | 4 | 3 | 2 | 0 |
但发现这样做不出来
观察题目,每次操作的是泥土不是花坛,所以我们可以把每个泥土在哪个花坛存起来,像这样:
数组 | 值 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
a | 1 | 2 | 2 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | 4 | 4 |
b | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 |
这好像是某一道题
具体代码
for(int i=1,u,v;i<=n;i++)
{
cin>>u>>v;
for(int j=1;j<=u;j++)a[++ta]=i;
for(int j=1;j<=v;j++)b[++tb]=i;
}
状态
既然是
d
p
dp
dp那就得知道
d
p
i
,
j
dp_i,_j
dpi,j表示的是什么?
这里我们可以用答案倒推法
最后要求
a
a
a数组经过最少的操作变为
b
b
b数组
输出的是
d
p
[
t
a
]
[
t
b
]
dp[ta][tb]
dp[ta][tb]
就能看得出来
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示把数组的前i项变得和b数组的前j项完全一样的最小花费。
初始化
把
a
a
a的前
i
i
i变成
b
b
b的前
0
0
0,只需将
a
a
a的泥土全部减掉,代价为
i
∗
y
i*y
i∗y
把
a
a
a的前
0
0
0变成
b
b
b的前
i
i
i,只需将
a
a
a的泥土全部加上,代价为
i
∗
x
i*x
i∗x
具体代码
for(int i=1;i<=ta;i++)dp[i][0]=y*i;
for(int i=1;i<=tb;i++)dp[0][i]=x*i;
状态转移
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]可以通过
3
3
3种操作退出来:
1.通过
d
p
[
i
]
[
j
−
1
]
+
x
dp[i][j-1]+x
dp[i][j−1]+x推出,对应题目第一条;
2.通过
d
p
[
i
−
1
]
[
j
]
+
y
dp[i-1][j]+y
dp[i−1][j]+y推出,对应题目第二条;
3.通过
d
p
[
i
−
1
]
[
j
−
1
]
dp[i-1][j-1]
dp[i−1][j−1]推出,对应题目第三条;
注意:不能从
d
p
[
i
+
1
]
[
j
]
dp[i+1][j]
dp[i+1][j]之类的推出。
具体代码
dp[i][j]=min(min(dp[i-1][j]+y,dp[i][j-1]+x),dp[i-1][j-1]+z*abs(a[i]-b[j]));
代码
良好做题习惯,不要复制
#include<bits/stdc++.h>
using namespace std;
int n,x,y,z,a[1010],b[1010],ta,tb,dp[1010][1010];
int main()
{
cin>>n>>x>>y>>z;
for(int i=1,u,v;i<=n;i++)
{
cin>>u>>v;
for(int j=1;j<=u;j++)a[++ta]=i;
for(int j=1;j<=v;j++)b[++tb]=i;
}
for(int i=1;i<=ta;i++)dp[i][0]=y*i;
for(int i=1;i<=tb;i++)dp[0][i]=x*i;
for(int i=1;i<=ta;i++)
{
for(int j=1;j<=tb;j++)
{
dp[i][j]=min(min(dp[i-1][j]+y,dp[i][j-1]+x),dp[i-1][j-1]+z*abs(a[i]-b[j]));
}
}
cout<<dp[ta][tb];
}
推荐
看完这片题解可以可以做一下Landscaping P和编辑距离这两题