描述
受折磨的灵魂是一个法系输出型英雄~他的技能全都是AOE(即攻击群体的技能)
在一个N*M的矩阵中,有N*M个敌人……魂之挽歌派受折磨的灵魂去消灭他们
对于每一个敌人(i,j),如果消灭它,魂之挽歌会给受折磨的灵魂a[i,j]的奖赏。
受折磨的灵魂每次可以消灭一个子矩阵中的敌人,但任意两次攻击的矩阵不能重叠。
由于受折磨的灵魂法力有限,他最多只能攻击K次。
受折磨的灵魂想知道,他最多能得到多少奖赏?输入
第一行,三个数N,M,K
接下来N行,每行M个数,表示每个a[i,j]输出
一个数,即受折磨的灵魂最多能得到多少奖赏
样例输入
3 2 2 1 -3 2 3 -2 3样例输出
9
提示
1<=N<=30
1<=M<=3
1<=K<=10
【Solution】
暴力死了…..原来M是1或2(原题SCOI2005最大子矩阵),现在加强到了3……直接代码吧,原理超简单….
【Code】
1: Program TormentedSoul(input,output);2: var a:array[1..100,1..3]of longint;3: F1:array[0..100,0..10]of longint;4: F2:array[0..10,0..100,0..100]of longint;5: F3:array[0..10,0..50,0..50,0..50]of longint;6: s:array[0..100,1..3]of longint;7: i,j,m,n,k,t,l,p,ans:longint;8: function max(a,b,c:longint):longint;
9: begin max:=a;if b>max then max:=b;if c>max then max:=c;end;10: Procedure Solve1;11: begin
12: for i:=1 to t do13: for j:=1 to n do14: F1[j,i]:=-19940805;15: for i:=1 to n do16: begin
17: readln(a[i,1]);18: s[i,1]:=s[i-1,1]+a[i,1];19: end;
20: for i:=1 to n do21: begin
22: for k:=1 to t do23: for j:=i-1 downto 0 do24: F1[i,k]:=max(F1[i,k],F1[j,k],F1[j,k-1]+s[i,1]-s[j,1]);25: if F1[i,t]>ans then ans:=F1[i,t];26: end;
27: writeln(ans);28: end;
29: Procedure Solve2;30: begin
31: for i:=1 to t do32: for j:=1 to n do33: for k:=1 to n do34: F2[i,j,k]:=-19940805;35: for i:=1 to n do36: begin
37: readln(a[i,1],a[i,2]);38: s[i,1]:=s[i-1,1]+a[i,1];39: s[i,2]:=s[i-1,2]+a[i,2];40: end;
41: for j:=1 to n do42: for k:=1 to n do43: begin
44: for i:=1 to t do45: begin
46: for l:=j-1 downto 0 do47: F2[i,j,k]:=max(F2[i-1,l,k]+s[j,1]-s[l,1],48: F2[i,j,k],49: F2[i,l,k]);50: for l:=k-1 downto 0 do51: F2[i,j,k]:=max(F2[i-1,j,l]+s[k,2]-s[l,2],52: F2[i,j,k],53: F2[i,j,l]);54: if k=j then55: for l:=k-1 downto i-1 do56: F2[i,j,k]:=max(F2[i,j,k],57: F2[i-1,l,l]+s[k,2]-s[l,2]+s[j,1]-s[l,1],58: F2[i,l,l]);59: end;
60: if F2[t,j,k]>ans then ans:=F2[t,j,k];61: end;
62: writeln(ans);63: end;
64: Procedure Solve3;65: begin
66: for i:=1 to t do67: for j:=1 to n do68: for k:=1 to n do69: for p:=1 to n do70: F3[i,j,k,p]:=-19940805;71: for i:=1 to n do72: begin
73: readln(a[i,1],a[i,2],a[i,3]);74: for j:=1 to 3 do s[i,j]:=s[i-1,j]+a[i,j];75: end;
76: for j:=1 to n do77: for k:=1 to n do78: for p:=1 to n do79: begin
80: for i:=1 to t do81: begin
82: for l:=j-1 downto 0 do83: F3[i,j,k,p]:=max(F3[i,j,k,p],84: F3[i-1,l,k,p]+s[j,1]-s[l,1],85: F3[i,l,k,p]);86: for l:=k-1 downto 0 do87: F3[i,j,k,p]:=max(F3[i,j,k,p],88: F3[i,j,l,p],89: F3[i-1,j,l,p]+s[k,2]-s[l,2]);90: for l:=p-1 downto 0 do91: F3[i,j,k,p]:=max(F3[i,j,k,p],92: F3[i,j,k,l],93: F3[i-1,j,k,l]+s[p,3]-s[l,3]);94: if k=j then95: for l:=k-1 downto 0 do96: F3[i,j,k,p]:=max(F3[i,j,k,p],97: F3[i,l,l,p],98: F3[i-1,l,l,p]+s[j,1]-s[l,1]+s[k,2]-s[l,2]);99: if j=p then100: for l:=j-1 downto 0 do101: F3[i,j,k,p]:=max(F3[i,j,k,p],102: F3[i,l,k,l],103: F3[i-1,l,k,l]+s[j,1]-s[l,1]+s[p,3]-s[l,3]);104: if k=p then105: for l:=k-1 downto 0 do106: F3[i,j,k,p]:=max(F3[i,j,k,p],107: F3[i,j,l,l],108: F3[i-1,j,l,l]+s[k,2]-s[l,2]+s[p,3]-s[l,3]);109: if(k=j)and(k=p)then110: for l:=j-1 downto 0 do111: F3[i,j,k,p]:=max(F3[i,j,k,p],112: F3[i,l,l,l],113: F3[i-1,l,l,l]+s[j,1]-s[l,1]+s[k,2]-s[l,2]+s[p,3]-s[l,3]);114: end;
115: if F3[t,j,k,p]>ans then ans:=F3[t,j,k,p];116: end;
117: writeln(ans);118: end;
119: begin
120: readln(n,m,t);ans:=-19940805;121: if m=1 then Solve1;122: if m=2 then Solve2;123: if m=3 then Solve3;124: end.