noip2007矩陣取數遊戲 2008 11 5

2021-07-09 20:45:47 字數 2476 閱讀 4054

noip2007矩陣取數遊戲 2008.11.5

注意:比大小位數不相同時,取位數大的數大;當位數相同時,要從最高位開始比較,相同,則往下比,不相同,則大的數就大。(我剛開始,弄成了從最低位開始比較,故,wa了

20多分鐘)

小結:這道題,我打了不下

5遍,一定要先想好,在紙上把每個細節都確定了,並確定這是最好的演算法,最好的資料結構,在開始敲程式,敲總是很快的,不要擔心,但一定在敲之前,保證正確!

program game;

const fin='game.in';fout='game.out';

maxn=80;

p=10000000;p1=7;

type

arr=array[0..50]of longint;

var f:array[1..maxn,1..maxn]of arr;

f1,f2:text;

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

max:arr;

a:array[1..maxn,1..maxn]of longint;

procedure init;

begin

assign(f1,fin);reset(f1);

assign(f2,fout);rewrite(f2);

read(f1,n,m);

for i:=1 to n do

for j:=1 to m do read(f1,a[i,j]);

fillchar(max,sizeof(max),0);

end;

procedure add(a1,b1:arr;var s:arr);

var i,j,l:longint;

begin

fillchar(s,sizeof(s),0);

if a1[0]>b1[0] then l:=a1[0] else l:=b1[0];

for i:=1 to l do

begin

s[i]:=a1[i]+b1[i]+s[i];

s[i+1]:=s[i+1]+s[i] div p;

s[i]:=s[i] mod p;

end;

if s[l+1]<>0 then

begin s[l+1]:=s[l+1]+s[l] div p;

s[l]:=s[l] mod p;

inc(l);

end;

s[0]:=l;

end;

function maxin(x1,x2:arr):arr;

var i:longint;

begin

if x1[0]>x2[0] then exit(x1)

else if x1[0]1)do dec(i);

if x1[i]>x2[i] then exit(x1) else exit(x2);

end;

end;

procedure dp;

var w,i,j,k:longint;x1,x2:arr;

begin

for w:=1 to n do

begin

fillchar(f,sizeof(f),0);

for i:=1 to m do

begin

f[i,i,0]:=1;

f[i,i,1]:=a[w,i]*2;

end;

for k:=2 to m do

for i:=1 to m-k+1 do

begin

j:=i+k-1;

fillchar(x1,sizeof(x1),0);

fillchar(x2,sizeof(x2),0);

x1[0]:=1;x1[1]:=a[w,j];

add(f[i,j-1],x1,x1);

x2[0]:=1;x2[1]:=a[w,i];

add(f[i+1,j],x2,x2);

f[i,j]:=maxin(x1,x2);

add(f[i,j],f[i,j],f[i,j]);

end;

add(f[1,m],max,max);

end;

end;

procedure print;

var i,l,j:longint;ch:string;

begin

write(f2,max[max[0]]);

for i:=max[0]-1 downto 1 do

begin

str(max[i],ch);

for j:=1 to p1-length(ch) do

write(f2,0);

write(f2,max[i]);

end;

end;

begin init;

dp;print;

close(f1);

close(f2);

end.

NOIP2007 矩陣取數遊戲

傳送門給定乙個n m的矩陣,在每一行中取m次數,每次取數只能從行首或尾取數,第i次取數的貢獻是 2 i 該點值 操作n行,求最大答案 n,m 80 不難發現行與行之間是完全獨立的,所以單獨處理每一行就好了 考慮區間dp 設 dp i j 表示區間i j的答案最大值 則有 dp i j max num...

NOIP2007 矩陣取數遊戲

鏈結 簡單dp 毒瘤高精 顯然行與行沒有關聯 所以只需要每行處理 考慮dp i,j,k 表示第i次取數,第j行,有k次取的頭的最大分數 直接dp即可 includeusing namespace std define ll int128inline intread while ch 0 ch 9 d...

NOIP2007提高組 矩陣取數遊戲

本題dp 高精度即可。首先我們可以發現它的貢獻只與行有關係,於是就分成n行,每行都做dp,然後將max加起來即可。ps 用高精度實現 上標 include include include define mo 100000 define ll long long using namespace std...