高一一班的座位表是個n*m的矩陣,經過乙個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。
作為計算機競賽教練的scp大老闆,想知道如何分配可以使得全班的喜悅值總和最大。
第一行兩個正整數n,m。
接下來是六個矩陣
第乙個矩陣為n行m列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學選擇文科獲得的喜悅值。
第二個矩陣為n行m列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學選擇理科獲得的喜悅值。
第三個矩陣為n-1行m列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學與第i+1行第j列的同學同時選擇文科獲得的額外喜悅值。
第四個矩陣為n-1行m列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學與第i+1行第j列的同學同時選擇理科獲得的額外喜悅值。
第五個矩陣為n行m-1列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學與第i行第j+1列的同學同時選擇文科獲得的額外喜悅值。
第六個矩陣為n行m-1列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學與第i行第j+1列的同學同時選擇理科獲得的額外喜悅值。
輸出乙個整數,表示喜悅值總和的最大值
1 2
1 1
100 110
1 1000
【樣例說明】
兩人都選理,則獲得100+110+1000的喜悅值。
【資料規模】
對於10%以內的資料,n,m<=4
對於30%以內的資料,n,m<=8
對於100%以內的資料,n,m<=100 所有喜悅值均為小於等於5000的非負整數
這一題的建模比較有創意。
考慮建立乙個超級源點s和乙個超級匯點t。
從s連邊到某個點表示選文科,從某個點連邊到t表示選理科,邊權值為給定的喜悅值。
對於兩個點都選文的情況,就新建乙個中間點,從s連到中間點,邊權為喜悅值,再從中間點連向這兩個點,邊權設為inf。
類似的可以處理處理科的情況。
這裡的連邊很關鍵,也不是很好想。
**還是比較好懂的。
#include
#include
#include
#define p(x,y) (~-(x)*m+(y)) //快速算點座標
#define fo(i,a,b) for (i=a;i<=b;i++)
using namespace std;
const int maxn=500000;
const int inf=10000007;
int n,m,i,j,p,x,tot,ans,s,t,cnt;
intnext[maxn],head[maxn],b[maxn],c[maxn],d[maxn],q[maxn],cur[maxn];
intread()
return su;
}void plus(int
x,int
y,int z)
void add(int
x,int
y,int z)
int bfs()}}
if (d[t]>0) return
1; else
return
0;}
int dfs(int
x,int f)}}
return0;}
int main()
fo(i,1,n)
fo(j,1,m)
fo(i,1,n-1)
fo(j,1,m)
fo(i,1,n-1)
fo(j,1,m)
fo(i,1,n)
fo(j,1,m-1)
fo(i,1,n)
fo(j,1,m-1)
while (bfs())
printf("%d\n",sum-ans);
}
2011集訓隊出題 happiness
description 高一一班的座位表是個n m的矩陣,經過乙個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。作為計算機競賽教練的scp大老闆,想知道如何分...
2011集訓隊出題 拆遷隊
lanxisi帶領著他的拆遷隊來整治乙個街道。這個街道由n個舊房子組成,從左到右編號為1.n。每個舊房子i有乙個正整數的美觀度ai。lanxisi希望整個街道從左到右美觀度嚴格遞增,也就是保證ai i。但是舊的街道明顯不符合這個要求,於是lanxisi希望拆遷一些舊房子並在原地建立新房子來滿足這一要...
2011集訓隊出題 跳跳棋
time limits 1000 ms memory limits 128000 kb description 跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動...