zoukankan      html  css  js  c++  java
  • 最小伤害 题解

    【问题描述】

    把儿站在一个NxN的方阵中最左上角的格子里。他可以从一个格子走到它右边和下边的格子里。每一个格子都有一个伤害值。他想在受伤害最小的情况下走到方阵的最右下角。

    给定N与N×N方阵中的伤害值,求出最小伤害。

    【样例输入】

        5

        1 0 0 0 0

        0 1 0 0 0

        0 0 1 0 0

        0 0 0 1 0

        0 0 0 0 1

    【样例输出】

       2

    【解题思路】

      这道题与过河卒(NOIP2002)的思路一样,且比过河卒更加容易(少了马的控制),典型的递推问题,用DP解决。

    【动规方程】

      f[i,j]:=min(f[i-1,j],f[i,j-1])+a[i,j](2<=i<=n,2<=j<=n);

    【边界条件】

       f[1,1]:=a[1,1];f[1,i]:=f[1,i-1]+a[1,i](2<=i<=n);f[i,1]:=f[i-1,1]+a[i,1](2<=i<=n);

       注意!最上边和最左边的两排也要先赋值!

    【代码实现】

    uses math;//这里用了数学库,就可以直接调用min函数,数学库中有许多有用的函数,就不必自己手写了。
    var a,f:array[1..1000,1..1000] of longint;
        i,j,n:longint;
    begin
     readln(n);
     for i:=1 to n do
      for j:=1 to n do
       read(a[i,j]);
    //边界赋值
     f[1,1]:=a[1,1];
     for i:=2 to n do
      begin
       f[1,i]:=f[1,i-1]+a[1,i];
       f[i,1]:=f[i-1,1]+a[i,1];
      end;
    //动态规划
     for i:=2 to n do
      for j:=2 to n do
       f[i,j]:=min(f[i-1,j],f[i,j-1])+a[i,j];
     writeln(f[n,n]);
    end.
    最小伤害
  • 相关阅读:
    10
    9
    8
    第七章
    第五章
    第六章
    android深度探索第四章
    android深度探索第三章
    android深度探索第二章
    android深度探索第一章
  • 原文地址:https://www.cnblogs.com/PengBoLiuXu/p/4481718.html
Copyright © 2011-2022 走看看