時間限制: 1 sec 記憶體限制: 128 mb
設有n*n的方格圖,我們將其中的某些方格填入正整數,
而其他的方格中放入0。
某人從圖得左上角出發,可以向下走,也可以向右走,直到到達右下角。
在走過的路上,他取走了方格中的數。(取走後方格中數字變為0)
此人從左上角到右下角共走3次,試找出3條路徑,使得取得的數總和最大。
第一行:n (4<=n<=20)
接下來乙個n*n的矩陣,矩陣中每個元素不超過80,不小於0
一行,表示最大的總和。
41 2 3 4
2 1 3 4
1 2 3 4
1 3 2 4
39題解:
法一:
dp
f[x1][y1][x2][x3]第乙個人走到(x1,y1),第二個人走到(x2,x1+y1-x2),第三個人走到(x3,x1+y1-x3)總和最大值(x1-1,y1)->(x1,y1)向右 (x2,x1-1+y1-x2)->(x2,x1+y1-x2)向下 (x3,x1-1+y1-x3)->(x3,x1+y1-x3)向下
(x1-1,y1)->(x1,y1)向右 (x2,x1-1+y1-x2)->(x2,x1+y1-x2)向下 (x3-1,x1+y1-x3)->(x3,x1+y1-x3)向右
(x1-1,y1)->(x1,y1)向右 (x2-1,x1+y1-x2)->(x2,x1+y1-x2)向右 (x3,x1-1+y1-x3)->(x3,x1+y1-x3)向下
(x1-1,y1)->(x1,y1)向右 (x2-1,x1+y1-x2)->(x2,x1+y1-x2)向右 (x3-1,x1+y1-x3)->(x3,x1+y1-x3)向右
(x1,y1-1)->(x1,y1)向下 (x2,x1+y1-1-x2)->(x2,x1+y1-x2)向下,(x3,x1+y1-1-x3)->(x3,x1+y1-x3)向下
(x1,y1-1)->(x1,y1)向下 (x2,x1+y1-1-x2)->(x2,x1+y1-x2)向下,(x3-1,x1+y1-x3)->(x3,x1+y1-x3)向右
(x1,y1-1)->(x1,y1)向下 (x2-1,x1+y1-x2)->(x2,x1+y1-x2)向右,(x3,x1+y1-1-x3)->(x3,x1+y1-x3)向下
(x1,y1-1)->(x1,y1)向下 (x2-1,x1+y1-x2)->(x2,x1+y1-x2)向右,(x3-1,x1+y1-x3)->(x3,x1+y1-x3)向右
#include#include#include
#include
using
namespace
std;
const
int n=21
;int
gi()
int f[n*2
][n][n][n],a[n][n];
intmain()}}
}printf("%d
",f[n+n-1
][n][n][n]);
return0;
}
法二:
網路流——最大費用最大流。
具體演算法如下:
拆點建圖,每乙個點都拆成兩個點,在這裡就稱為出點和入點。
出點和入點建兩條邊,一條費用為s[i][j],流量為1;一條費用為0,流量為inf。(分別表示選擇這個點和從這個點上經過)
將(i,j)的出點分別和(i+1,j)(i,j+1)的入點建邊,流量為inf,費用為0。(表示行進)
跑一邊最大費用最大流就可以了。
額~~~鼓掌鼓掌。
#include#include#include
#include
#include
#include
#include
#include
#include
#include
#define inf (2e8)
using
namespace
std;
intn,m;
intans;
struct
node
edge[
500001
];int size=1,head[20001],s[51][51
];void putin(int
from,int to,int cap,int
cost)
void
in(int
from,int to,int cap,int
cost)
void
build()
}}int f[300001],pre[300001],vis[300001
];bool bfs(int src,int
des)
queue
mem;
mem.push(src);
f[src]=0
; vis[src]=1
;
while(!mem.empty())}}
}if(f[des]==-1)return0;
else
return1;
}//最大費用最大流,求的是最長路,因此初值為-1
void change(int src,int
des)
x=des;
while(x!=src)
}//反過來修改每一條邊的流量,並計算ans的值,edge[i^1]為edge[i]的反向邊
void max_cost_flow(int src,int
des)
intmain()
三取方格數
描述 description 設有n n的方格圖,我們將其中的某些方格填入正整數,而其他的方格中放入0。某人從圖得左上角出發,可以向下走,也可以向右走,直到到達右下角。在走過的路上,他取走了方格中的數。取走後方格中數字變為0 此人從左上角到右下角共走3次,試找出3條路徑,使得取得的數總和最大。輸入格...
TYVJ1414(三取方格數)
演算法 dp 與二取方格數類似,設f i,j,k,l 為走了i步 初始為1步 後,第1次取數在j行,第2次取數在k行,第3次取數在l行的最大值。然後就是類似的轉移,注意這裡一共有8種轉移情況,都要考慮到,設j為當前走到的行,加上j行的值,然後去判斷與k,l是否重複,不重複還要加上它們的值。走i步最多...
方格取數 1
problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...