2047 對布滿灰塵的西洋棋宣告將軍

2021-07-16 20:26:05 字數 1707 閱讀 7369

題目描述

維多利加:這裡的確有許多書,但是……

這裡沒有你。

【問題描述】

布洛瓦侯爵想利用維多利加來占卜二戰的局勢。侯爵只給了她一盤西洋棋和許多書,便將她關在了王宮的地牢。

西洋棋盤可以看成乙個 n*m 的網格。西洋棋可以擺放在任何乙個格仔裡,而不是網格線的交叉點上。

維多利加將乙個棋子放在了左上角的格仔上。她試著移動這個棋子,棋子只會向右或者向下移動。

每個格仔有乙個權值,維多利加想知道,從左上角到右下角的所有路徑中:

1.經過的格仔的權值和最大是多少?

2.權值和最大的路徑一共有多少條?

輸入

第一行兩個整數 n,m。

接下來 n 行,每行 m 個整數,表示每個格仔的權值。

輸出

輸出兩行,第一行表示最大權值和,第二行表示權值和最大的路徑數除以 1e9+7 的餘數。

樣例輸入

3 31 1 1

1 2 1

1 1 1

樣例輸出

6

4資料範圍限制

ai,j 表示第 i 行第 j 列格仔的權值。

30%的資料保證,n≤5,m≤5。

60%的資料保證,n≤100,m≤100。

另有 20%的資料保證,對於任意的 i 和 j,ai,j = 1。

100%的資料保證,n≤2000,m≤2000,|ai,j|≤10^9。

const

maxn=2000;

var a,f:array [0..maxn] of int64;

i,j,n,m,s,hjy:longint;

begin

assign(input,'chess.in'); reset(input);

assign(output,'chess.out'); rewrite(output);

fillchar(a,sizeof(a),128);

readln(n,m);

f[1]:=1;

hjy:=1000000007;

for i:=1 to n do

begin

for j:=1 to m do

begin

read(s);

if (i=1) and (j=1) then a[j]:=s;

if (i<>1) or (j<>1) then

begin

if a[j]=a[j-1] then f[j]:=(f[j]+f[j-1]);

if a[j]>=a[j-1] then a[j]:=s+a[j]

else begin a[j]:=s+a[j-1]; f[j]:=f[j-1]; end;

iff[j]>hjy then f[j]:=f[j] mod hjy;

end;

end;

readln;

end;

writeln(a[m]);

writeln(f[m]);

close(input); close(output);

end.

馬的移動問題 西洋棋BFS

輸入包含多組測試資料。每組輸入由兩個方格組成,每個方格包含乙個小寫字母 a h 表示棋盤的列號,和乙個整數 1 8 表示棋盤的行號。對於每組輸入,輸出一行 to get from xx to yy takes n knight moves.e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 ...

POJ 1657求西洋棋的格數

題意 王 後 車 象的走子規則如下 寫乙個程式,給定起始位置和目標位置,計算王 後 車 象從起始位置走到目標位置所需的最少步數。思路 王 橫 直 斜都可以走,但每步限走一格。其步數為 max x,y 後 橫 直 斜都可以走,每步格數不受限制。其步數為 1 可以直走或斜走到達 x y x 0 y 0 ...

poj 1657 西洋棋棋盤上的距離

題意 給定西洋棋上的乙個起點和乙個終點,問王 後 車 象分別最少走多少步能從起點到終點。思路 細心就可以。include include define max a,b a b a b int a,b,c,d,t int test1 int test2 int main printf d max ab...