方格取數 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動態規劃,位運算,排列組合,...