初见安~这里是传送门【我知道这是一个很冷门的题QAQ】入门OJ P4033
Description
在某款极具技术含量的网络游戏中,佳佳靠着他的聪明智慧垄断了游戏中的油田系统。油田里有许多油井,这些油
井排成一个M*N的矩形。每个油井都有一个固定的采油量。每两个相邻的油井之间有一条公路,这些公路是油井与
油井之间唯一的运油方式。佳佳的领地在油田的右方和下方,他需要把采到的油通过这些公路运输到他的领地。为
了保证采到的油以最快的方式供给右方和下方的领地,对于每个油井,佳佳总是将采到的油分成非空的两部分将其
中一部分沿公路一直向右运输到油田的右边界,将另一部分沿公路一直向下运输到油田的下边界。然而树大招风,
网络游戏中的GM以保证游戏公平为由,要求佳佳主动贡献出K个油井。更惨的是,失去某些油井不单意味着采油量
减少,这还将会导致运输线路的中断。如果佳佳贡献出了某个油井,那么所有要经过这个油井的运输任务将无法完
成。佳佳想保证贡献K个油井之后自己的损失最小(损失即为失去的所有油井的采油量之和),而他希望其他的所
有油井还能够像往常一样正常运输。于是他向你求救,希望你能帮助他实现他的想法。
Input
第一行有三个用空格隔开的正整数M,N和K,它们分别表示油田的长、宽和佳佳需要贡献出的油田数。
以下N行中每行有M个用空格隔开的正整数。这些正整数保证不超过10000,它们描述了油田中各个油井的采油量。
输入数据保证K<=M*N,M<=60,N<=60。
Output
一个整数,表示佳佳最少要损失的采油量。
Sample Input
5 3 4
3 4 1 4 5
1 10 7 8 13
3 5 8 9 11
Sample Output
9
佳佳贡献出下面标有“x”的油井是符合条件的最小损失方案。
x x x 4 5
x 10 7 8 13
3 5 8 9 11
Sol
一看就是个dp题【我也不知道这个题是哪里来的QAQ】
因为每个数都要分成两部分,一部分向右,一部分向下,所以我们要保证保留的都靠右,舍弃的随行数的增加每一行都越来越少。所以对于价值的应用,我们直接存前缀和。也很容易得到状态:表示到第i行,选j个,总共选了k个舍弃时的最小值。
枚举每一行,枚举这一行选多少个,枚举至此共有多少个已经舍弃,这里我们还差转移——用上一行的状态。因为上一行舍弃的数量必须大于等于这一行舍弃的,所以从j开始枚举上一行选择的数量l。4重for循环,上界都有优化的空间【否则10s也会TLE】,状态转移方程为:
至此你已经可以自己去写了:)
下面是代码——
#include<bits/stdc++.h>
using namespace std;
int read()
{
int x = 0, f = 1, ch = getchar();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
return x * f;
}
int n, m, K;
int dp[70][70][3700], w[100][100];//注意K的范围!!!
signed main()
{
memset(dp, 0x3f, sizeof dp);
m = read(), n = read(), K = read();
for(register int i = 1; i <= n; i++) for(register int j = 1; j <= m; j++) w[i][j] = w[i][j - 1] + read();
//直接存前缀和
for(register int i = 0; i <= n; i++) dp[i][0][0] = dp[0][i][0] = dp[0][0][i] = 0;//初始化很重要
for(register int i = 1; i <= n; i++)
for(register int j = 0; j <= min(m, K); j++)
for(register int k = j; k <= min(K, i * m); k++)//这里的上界不优化的话会TLE
for(register int l = j; l <= min(m, k); l++)
dp[i][j][k] = min(dp[i][j][k], dp[i - 1][l][k - j] + w[i][j]);
int ans = 0x3f3f3f3f;
for(int i = 0; i <= n; i++) ans = min(ans, dp[n][i][K]);//找最小的答案,每一行可以选任意多
printf("%d\n", ans);
return 0;
}
这个题挺毒瘤的……但是我能自己想到正解的状态和转移还是很满足了!!!【debug了一个晚上QAQ】
迎评:)
——End——