三取方格數

2022-05-11 01:26:26 字數 3122 閱讀 2634

時間限制: 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...