SSL 1644 取數字問題

2021-07-27 20:00:52 字數 1930 閱讀 8283

取數字問題

time limit:10000ms memory limit:65536k

total submit:300 accepted:101

case time limit:1000ms

description

給定m*n的矩陣,其中的每個元素都是-10到10之間的整數。你的任務是從左上角(1,1)走到右下角(m,n),每一步只能向右或向下,並且不能走出矩陣的範圍。你所經過的方格裡面的數字都必須被選取,請找出一條最合適的道路,使得在路上被選取的數字之和是盡可能小的正整數。

input

第一行兩個整數m,n,(2<=m,n<=10),分別表示矩陣的行和列的數目。

接下來的m行,每行包括n個整數,就是矩陣中的每一行的n個元素。

output

僅一行乙個整數,表示所選道路上數字之和所能達到的最小的正整數。如果不能達到任何正整數就輸出-1。

sample input

2 2

0 2

1 0

sample output

這題有兩種方法ace

①用dfs,秒過

②用dp,設f[i,j,k]為到i、j,數k存不存在

動態轉移方程

if a[i-1,j,k]=true then f[i,j,k+a[i,j]]:=true

if a[i,j-1,k]=true then f[i,j,k+a[i,j]]:=true

方法一:

#include 

int m,n,a[20][20],ans=2147438647;

void search(int i,int j,int

sum)

int main()

方法二:

var  m,n,i,j,k:longint;

a:array[0..11,0..11]of longint;

f:array[0..11,0..11,-2000..2000]of boolean;

begin

fillchar(f,sizeof(f),false);

readln(n,m);

for i:=1

to n do

begin

for j:=1

to m do

begin

read(a[i,j]);

end;

readln;

end;

f[1,1,a[1,1]]:=true;

for j:=2

to m do

for k:=-1000

to1000

doif f[1,j-1,k] then f[1,j,k+a[1,j]]:=true;

for i:=2

to n do

for k:=-1000

to1000

doif f[i-1,1,k] then f[i,1,k+a[i,1]]:=true;

for i:=2

to n do

for j:=2

to m do

begin

for k:=-1000

to1000

doif f[i,j-1,k] then f[i,j,k+a[i,j]]:=true;

for k:=-1000

to1000

doif f[i-1,j,k] then f[i,j,k+a[i,j]]:=true;

end;

i:=1;

while (f[n,m,i]=false)and(i<=1000) do inc(i);

if i=1001

then

write(-1) else

write(i);

end.

SSL 1644取數字問題

time limit 1000ms memory limit 65536k給定m n的矩陣,其中的每個元素都是 10到10之間的整數。你的任務是從左上角 1,1 走到右下角 m,n 每一步只能向右或向下,並且不能走出矩陣的範圍。你所經過的方格裡面的數字都必須被選取,請找出一條最合適的道路,使得在路上...

取數字問題

給定m n的矩陣,其中的每個元素都是 10到10之間的整數。你的任務是從左上角 1,1 走到右下角 m,n 每一步只能夠向右或者向下,並且不能夠走出矩陣的範圍。你所經過的方格裡面的數字都必須被選取,請找出一條最合適的道路,使得在路上被選取的數字之和是盡可能小的正整數。輸入第1行是兩個整數m和n,2 ...

取數字問題

取數字問題 time limit 10000ms memory limit 65536k total submit 308 accepted 104 case time limit 1000ms description 給定m n的矩陣,其中的每個元素都是 10到10之間的整數。你的任務是從左上角 ...