在麥克雷的面前出現了乙個有n*m個格仔的矩陣,每個格仔用「.」或「#」表示,「.」表示這個格仔可以放東西,「#」則表示這個格仔不能放東西。現在他拿著一條1×2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。
因為棍子是1×2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影響的,否則兩塊是互不干擾的,那麼用矩陣字首和就能隨便解決,只需要再減去邊緣跨塊的方案數就可以啦!
var
c:array[0..501,0..501] of char;
f,h,l:array[0..501,0..501] of int64;
n,m,i,j,q,x1,x2,y1,y2:longint;
ans:int64;
begin
readln(n,m);
for i:=0
to n do c[i,0]:='#';
for j:=0
to m do c[0,m]:='#';
for i:=0
to n do c[i,m+1]:='#';
for j:=0
to m do c[n+1,m]:='#';
for i:=1
to n do
begin
for j:=1
to m do
begin
read(c[i,j]);
h[i,j]:=h[i,j-1];l[i,j]:=l[i-1,j];
if c[i,j]='#'
then
continue;
if c[i-1,j]='.'
then inc(h[i,j]);
if c[i,j-1]='.'
then inc(l[i,j]);
end;
readln;
end;
for i:=1
to n do
for j:=1
to m do
begin
f[i,j]:=f[i-1,j]+f[i,j-1]-f[i-1,j-1];
if c[i,j]='#'
then
continue;
if c[i-1,j]='.'
then inc(f[i,j]);
if c[i,j-1]='.'
then inc(f[i,j]);
end;
readln(q);
for i:=1
to q do
begin
readln(x1,y1,x2,y2);
ans:=f[x2,y2]-f[x2,y1-1]-f[x1-1,y2]+f[x1-1,y1-1];
ans:=ans-h[x1,y2]+h[x1,y1-1];
ans:=ans-l[x2,y1]+l[x1-1,y1];
writeln(ans);
end;
end.
NOIP2016提高A組模擬9 21 矩陣
看題目戳這裡 看不了的話就看下面吧不過少了乙個圖而且sample input很奇怪qaq description 在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少...
NOIP2007提高組 矩陣取數遊戲
本題dp 高精度即可。首先我們可以發現它的貢獻只與行有關係,於是就分成n行,每行都做dp,然後將max加起來即可。ps 用高精度實現 上標 include include include define mo 100000 define ll long long using namespace std...
提高組NOIP2007 矩陣取數遊戲
題目描述 帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的n m的矩陣,矩陣中的每個元素a i,j 均為非負整數。遊戲規則如下 每次取數時須從每行各取走乙個元素,共n個。m次後取完矩陣所有元素 每次取走的各個元素只能是該元素所在行的行首或行尾 每次取數都有乙個得分值,為每行取數的得分之和,每行取數的...