2047. 对布满灰尘的西洋棋宣告将军

2047. 对布满灰尘的西洋棋宣告将军 

题目描述

维多利加:这里的确有许多书,但是……
这里没有你。
【问题描述】
        布洛瓦侯爵想利用维多利加来占卜二战的局势。侯爵只给了她一盘西洋棋和许多书,便将她关在了王宫的地牢。
       西洋棋盘可以看成一个 N*M 的网格。西洋棋可以摆放在任何一个格子里,而不是网格线的交叉点上。
       维多利加将一个棋子放在了左上角的格子上。她试着移动这个棋子,棋子只会向右或者向下移动。
       每个格子有一个权值,维多利加想知道,从左上角到右下角的所有路径中:
       1.经过的格子的权值和最大是多少?
       2.权值和最大的路径一共有多少条?

输入

第一行两个整数 N,M。
接下来 N 行,每行 M 个整数,表示每个格子的权值。

输出

输出两行,第一行表示最大权值和,第二行表示权值和最大的路径数除以 1e9+7 的余数。

样例输入

3 3
1 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值