題目描述
description
在一塊梯形田地上,一群蚯蚓在做收集食物遊戲。蚯蚓們把梯形田地上的食物堆積整理如下:
a(1,1) a(1,2)…a(1,m)
a(2,1) a(2,2) a(2,3)…a(2,m) a(2,m+1)
a(3,1) a(3,2) a(3,3)…a(3,m+1) a(3,m+2)
……
a(n,1)
a(n,2)
a(n,3)…
a(n,m+n-1)
它們把食物分成n行,第1行有m堆的食物,每堆的食物量分別是a(1,1),a(1,2),…,a(1,m);
第2行有m+1堆食物,每堆的食物量分別是a(2,1),a(2,2),…, a(2,m+1);以下依次有m+2堆、m+3堆、…m+n-1堆食物。
現在蚯蚓們選擇了k條蚯蚓來測試它們的合作能力(1≤ k≤m)。測試法如下:第1條蚯蚓從第1行選擇一堆食物,然後往左下或右下爬,並收集1堆食物,例如從a(1,2)只能爬向a(2,2)或a(2,3),而不能爬向其它地方。接下來再爬向下一行收集一堆食物,直到第n行收集一堆食物。第1條蚯蚓所收集到的食物量是它在每一行所收集的食物量之和;第2條蚯蚓也從第1行爬到第n行,每行收集一堆食物,爬的方法與第1條蚯蚓相類似,但不能碰到第1條蚯蚓所爬的軌跡;一般地,第i條蚯蚓從第1行爬到第 n行,每行收集一堆食物,爬的方法與第1條蚯蚓類似,但不能碰到前 i-1條蚯蚓所爬的軌跡。這k條蚯蚓應該如何合作,才能使它們所收集到的食物總量最多?收集到的食物總量可代表這k條蚯蚓的合作水平。
給定上述梯形m、n和k的值(1≤k≤m≤30;1≤n≤30)以及梯形中每堆食物的量(小於10的非整數),程式設計計算這k條蚯蚓所能收集到的食物的最多總量。
輸入描述
inputdescription
輸入資料由檔名為input1.*的文字檔案提供,共有n+1行。每行的兩個資料之間用乙個空格隔開。
●第1行是n、m和k的值。
輸出描述
outputdescription
程式執行結束時,在螢幕上輸出k蚯蚓條所能收集到的食物的最多總量。
樣例輸入
sampleinput
3 2 2
1 25
0 2
1 10 0 6
樣例輸出
sampleoutput
26
其實這一題和我之前寫的方格取數2差不多= =
用spfa跑一邊最大費用流。
分析:怎麼說膩=。=
你要會做這道題你得知道什麼是網路流,這裡需要將起點自己模擬出來,設為s,再將s拆成兩個點(s——》s'),中間用一條最大流量為k的邊連起來。再去將第一行的所有點與這個s'連起來,最大流量均為 1(因為只能跑一次)。由於只有點有值,邊是沒有價值的,所以那些並非拆點產生的邊的花費均為0,而拆點產生的邊連線兩個點的價值即為原來那個點的價值。
由於原圖中不可能存在環,所以用求最短路徑的spfa去跑最大費用流是不會有問題的。
**:#include
#include
#include
#include
#include
using namespace std;
int now=1,start=1,end,n,m;
intnext[100001],head[100001],other[100001],flow[100001],cost[100001],cap[100001];
struct point ;
point pointnumber[100][100];
inline point point_number(int x,int y)
inline void point_add(int x,int y)
else
add_side(point_number(x-1,y).out,point_number(x,y).in,0,1,0),
add_side(point_number(x,y).in,point_number(x-1,y).out,0,0,0);
else
add_side(0,point_number(x,y).in,0,1,0),
add_side(point_number(x,y).in,0,0,0,0);
if(x==n)
add_side(point_number(x,y).out,end,0,1,0),
add_side(end,point_number(x,y).out,0,0,0);
} void read()
int res;
int line[100001],pre[100001],dis[100001];
bool visited[100001];
inline bool spfa()
j=next[j]; }
if(line[left]!=1)visited[line[left]]=false;
l++; }
res=dis[end];
if(res==0)
returnfalse;
int i=end;
do
flow[j]+=1;
flow[j^1]-=1;
i=pre[i];
}while(i!=1);
return res!=0; }
int main()
codevs1033 蚯蚓的遊戲問題
題目描述 description a 1,1 a 1,2 a 1,m a 2,1 a 2,2 a 2,3 a 2,m a 2,m 1 a 3,1 a 3,2 a 3,3 a 3,m 1 a 3,m 2 a n,1 a n,2 a n,3 a n,m n 1 它們把食物分成n行,第1行有m堆的食物,每...
CODEVS1033 蚯蚓的遊戲問題(費用流)
傳送門 最大費用最大流問題,也是乙個比較經典的模型。拆點 可以看做是入點和出點,容量為1,費用為每乙個點的食物總量,以保證所有的點都只經過一次。分別多建乙個起點和終點,起點分別向第一行的點連一條邊,容量為inf,費用為0,最後一行的點分別向終點連邊,容量為inf,費用為0,只是表示可以流過。從超級源...
1033 蚯蚓的遊戲問題
題目描述 description a 1,1 a 1,2 a 1,m a 2,1 a 2,2 a 2,3 a 2,m a 2,m 1 a 3,1 a 3,2 a 3,3 a 3,m 1 a 3,m 2 a n,1 a n,2 a n,3 a n,m n 1 它們把食物分成n行,第1行有m堆的食物,每...