方格取數 2

2021-07-28 11:29:48 字數 1441 閱讀 3267

方格取數 2

時間限制: 1 s 空間限制: 128000 kb

題目描述 description

給出乙個n*n的矩陣,每一格有乙個非負整數aij,(aij <= 1000)現在從(1,1)出發,可以往右或者往下走,最後到達(n,n),每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要求k次所達到的方格的數的和最大

輸入描述 input description

第一行兩個數n,k(1<=n<=50, 0<=k<=10)

接下來n行,每行n個數,分別表示矩陣的每個格仔的數

輸出描述 output description

乙個數,為最大和

樣例輸入 sample input

3 11 2 3

0 2 1

1 4 2

樣例輸出 sample output

資料範圍及提示 data size & hint

1<=n<=50, 0<=k<=10

題解 因為每個數只能取一次,但是方格可以走多次所以要拆點,將每個點拆分成兩個,兩點之間連兩條邊,一條邊流量為1,權值為方格裡的數;另一條邊為走的次數k,權值為0。

#include

#include

#include

#include

#include

using

namespace

std;

int a[50100],nxt[50100],p[5010],remain[50100],w[50100],dis[50100],last[50100];

bool b[50100];

int n,k,tot,maxflow,mincost,tn,tmp;

inline

void add(int x,int y,int z,int v)

inline

int addflow(int s,int t)

now=t;

while(now!=s)

return sum;

} inline

bool spfa(int s,int t)

} v=nxt[v];

} }

if(dis[t]<0) return

false;

int t=addflow(s,t);

maxflow+=t;

mincost+=dis[t]*t;

return

true;

}int main()

tn*=2;

tn++;

add(0,1,k,0);

add(tn-1,tn,k,0);

while(spfa(0,tn));

printf("%d",mincost);

return

0;}

1227 方格取數 2

給出乙個n n的矩陣,每一格有乙個非負整數aij,aij 1000 現在從 1,1 出發,可以往右或者往下走,最後到達 n,n 每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要求k次所達到的方格的數的和最大 輸入格式 第一行兩個數n,k 1 n 50,0 k 10 接下來n...

方格取數 1

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...

特殊方格取數

特殊方格取數 在n n n 20 的方格棋盤上放置n 個車,某些格仔不能放,求使它們不能互相攻擊的方案總數。第一行,有兩個數 n m n表示方格棋盤大小,m表示不能放的格仔數量 下面有m行,每行兩個整數,為不能放的格仔的位置。只有一行,即得出的方案總數。2 1 1 1 1動態規劃,位運算,排列組合,...