zoukankan      html  css  js  c++  java
  • 【暴力DP】[Dota1004]受折磨的灵魂(TormentedSoul)

    描述

    受折磨的灵魂是一个法系输出型英雄~他的技能全都是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 do
    
     13:         for j:=1 to n do
    
     14:           F1[j,i]:=-19940805;
    
     15:       for i:=1 to n do
    
     16:         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 do
    
     21:         begin
    
     22:           for k:=1 to t do
    
     23:             for j:=i-1 downto 0 do
    
     24:               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 do
    
     32:         for j:=1 to n do
    
     33:           for k:=1 to n do
    
     34:             F2[i,j,k]:=-19940805;
    
     35:         for i:=1 to n do
    
     36:           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 do
    
     42:           for k:=1 to n do
    
     43:             begin
    
     44:               for i:=1 to t do
    
     45:                 begin
    
     46:                   for l:=j-1 downto 0 do
    
     47:                     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 do
    
     51:                     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 then
    
     55:                     for l:=k-1 downto i-1 do
    
     56:                       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 do
    
     67:         for j:=1 to n do
    
     68:           for k:=1 to n do
    
     69:             for p:=1 to n do
    
     70:               F3[i,j,k,p]:=-19940805;
    
     71:       for i:=1 to n do
    
     72:         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 do
    
     77:         for k:=1 to n do
    
     78:           for p:=1 to n do
    
     79:             begin
    
     80:               for i:=1 to t do
    
     81:                 begin
    
     82:                   for l:=j-1 downto 0 do
    
     83:                     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 do
    
     87:                     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 do
    
     91:                     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 then
    
     95:                    for l:=k-1 downto 0 do
    
     96:                      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 then
    
    100:                    for l:=j-1 downto 0 do
    
    101:                      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 then
    
    105:                    for l:=k-1 downto 0 do
    
    106:                      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)then
    
    110:                    for l:=j-1 downto 0 do
    
    111:                      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.
  • 相关阅读:
    vue axios接口封装、Promise封装、简单的axios方法封装、vue接口方法封装、vue post、get、patch、put方法封装
    vue-router 报错、:Avoided redundant navigation to current location 错误、路由重复
    微信小程序支付、小程序支付功能、小程序支付方法、微信小程序支付方法
    微信小程序热更新,小程序提示版本更新,版本迭代,强制更新,微信小程序版本迭代
    微信小程序动态修改title,动态配置title,动态配置头部,微信小程序动态配置头部
    响应式布局rem、rem方法封装、移动端响应式布局
    jquery 选项卡切换、选项卡封装、简单的jquery选项卡封装、tab切换效果
    js获取url并截取相应的字段,js解决url获取中文字段乱码问题
    微信小程序接口封装、原生接口封装、request、promise封装
    20193327《Python程序设计》实验报告三
  • 原文地址:https://www.cnblogs.com/Loongint/p/2197902.html
Copyright © 2011-2022 走看看