题意:有一个nxm的格子矩阵,走每个格子都需要消耗一部分体力,只能向下走或者向右走,如果中途体力<0则不能继续走下去,计算从(1,1)走到(m,n)所需耗费的最少体力。
思路:最早是一看题目就想到用DFS做,结果就GG了。后来在提醒下想起了动态规划也可以用来解决此类问题,且方便快捷。重点在于中间要判断越界的情况,以及因为起点终点已经确定,所以需要循环倒序来保证是终点为(m,n)。
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int d[2005][2005];
int dp[2005][2005];
int main(){
int n,m;
while(cin>>n>>m){
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>d[i][j];
dp[i][j]=d[i][j];
}
}
for(int i=n-1;i>=0;i--){
for(int j=m-1;j>=0;j--){
if(i+1<n&&j+1<m)
dp[i][j]+=min(dp[i+1][j],dp[i][j+1]);
else if(i+1>=n&&j+1<m)
dp[i][j]+=dp[i][j+1];
else if(j+1>=m&&i+1<n)
dp[i][j]+=dp[i+1][j];
}
}
cout<<dp[0][0]<<endl;
}
return 0;
}