有一个m*n的矩阵,每个位置都有一个武力超强的武士,而你也已经山中修炼了30年。现在你要挑战这些武士。挑战的规则和顺序是这样的:第一个和最后一个你要挑战的分别是位于左上角和右上角的武士,而每挑战完一个你可以选择相邻的右边、上边或下边的武士继续挑战,但是挑战过的就不能再选择了。刚开始你的血值是0,每打完一个武士,你的血值的变化等于相应位置上的整数(正数代表增血,负数代表掉血)。当然,你不会因为血值小于0而死掉。为了到最后得到更大的血值,你该如何根据规则来选择挑战的武士呢?
输入:输入有多组测试数据(不超过100组)。每组数据的第一行输入两个正整数m,n(m<=100,n<=100)。接下来的m行,每行n个整数,分别代表挑战相应位置武士你的血值的变化,每个整数都大于等于-100且小于等于100。
输出:每组测试数据输出一行,输出一个整数,代表根据最优的打法,你打完右上角那个武士时能获得的最大的血值。
输入样例:
3
1
2
3
2
1
1
输出样例:
18
4
解法:
DP或者记忆化搜索。每个点会有两个状态。Dp[i][j][0]表示向右或向下走的最大值,Dp[i][j][1]表示向右或向上的最大值。根据题意得到的转移方程是:Dp[i][j][0]=num[i][j]+max(Dp[i+1][j][0],max(Dp[i][j+1][1],Dp[i][j+1][0]);
Dp[i][j][1]=num[i][j]+max(Dp[i+1][j][1],max(Dp[i][j+1][1],Dp[i][j+1][0]);