跑道的每一格都有一些金币,当牛牛跑到一个格子,他会获得这个格子的所有金币。
当牛牛位于第i行第j列时,他可以的下一步最多可能有三种选择:
1. 不花费金币跑到第i行第j+1列
2. 花费
3. 花费
(牛牛是一个富豪,本身带了很多的金币,所以你不用担心他钱不够用)
现在告诉你所有格子的金币数量和每一列的金币花费,牛牛想知道他跑到第n列最多可以赚得多少金币(赚得金币=获得金币-消耗金币)
3,[1,9,3],[6,4,6],[1,1,5],[3,2,1]
16
一开始牛牛选择位于第2行第1列,拿到6个金币。然后牛牛花3金币到第1行的2列拿到9个金币,最后牛牛花费2金币到第2行第3列。总共获得21金币,消耗5金币。赚得16金币。
第1个参数n代表跑道的列数第2,3,4个参数vector<int> a1,a2,a3各有n个元素,代表第1,2,3行每一列的金币个数第5个参数vector<int> m有n个元素代表每一列进行换行的时候需要的金币花费
class Solution { public: int solve(int n, vector<int>& a1, vector<int>& a2, vector<int>& a3, vector<int>& m) { // write code here vector<vector<int> > dp(3,vector<int>(n,0)); //3行n列矩阵 //初始化 dp[0][0]=a1[0]; dp[1][0]=a2[0]; dp[2][0]=a3[0]; for(int i=1;i<n;i++){ dp[0][i]=max(dp[0][i-1],dp[1][i-1]-m[i-1])+a1[i]; dp[1][i]=max(dp[1][i-1],max(dp[0][i-1],dp[2][i-1])-m[i-1])+a2[i]; dp[2][i]=max(dp[2][i-1],dp[1][i-1]-m[i-1])+a3[i]; } int Max = max(dp[0][n-1],max(dp[1][n-1],dp[2][n-1])); return Max; } };
class Solution { public: int solve(int n, vector<int>& a1, vector<int>& a2, vector<int>& a3, vector<int>& m) { int x=a1[0], y=a2[0], z=a3[0], xx, yy, zz; for(int i=0;i<n-1;i++){ xx = max(x, y-m[i]) + a1[i+1]; yy = max(y, max(x, z)-m[i]) + a2[i+1]; zz = max(z, y-m[i]) + a3[i+1]; x = xx; y = yy; z = zz; } return max(x, max(y, z)); } };
public int solve (int n, int[] a1, int[] a2, int[] a3, int[] m) { // write code here int[][] dp = new int[3][n]; dp[0][0] = a1[0]; dp[1][0] = a2[0]; dp[2][0] = a3[0]; for (int j = 1; j < n; j++) { dp[0][j] = a1[j] + Math.max(dp[0][j-1], dp[1][j-1]-m[j-1]); dp[1][j] = a2[j] + Math.max(dp[1][j-1], Math.max(dp[0][j-1]-m[j-1], dp[2][j-1]-m[j-1])); dp[2][j] = a3[j] + Math.max(dp[2][j-1], dp[1][j-1]-m[j-1]); } return Math.max(dp[0][n-1],Math.max(dp[1][n-1], dp[2][n-1])); }
public int solve (int n, int[] a1, int[] a2, int[] a3, int[] m) { //从后往前推,从前往后写。如果走到0,n-1获得最多的金币,那么怎么走到0,n-1呢? 从0,n-2走,还是从1,n-2走,->求max // write code here // dp 代表牛牛位于此位置上时的最大金币。 int[][] dp = new int[3][n]; dp[0][0] = a1[0]; dp[1][0] = a2[0]; dp[2][0] = a3[0]; for(int i=1;i<n;i++){ //站到0,i 位置上时有两种情况,一是从第一列向前一步,二是从第二列第i-1个位置上 向左前 走到第一列。 dp[0][i] = Math.max(dp[0][i-1],dp[1][i-1]-m[i-1]) + a1[i]; //站到1,i 位置上时有三种情况 dp[1][i]=Math.max(Math.max(dp[0][i-1],dp[2][i-1])-m[i-1],dp[1][i-1])+a2[i]; //站到2,i 位置上时有两种种情况 dp[2][i]=Math.max(dp[2][i-1],dp[1][i-1]-m[i-1])+a3[i]; } return Math.max(Math.max(dp[0][n-1],dp[1][n-1]),dp[2][n-1]); }
import java.util.*; public class Solution { /** * 变相 * @param n int整型 * @param a1 int整型一维数组 * @param a2 int整型一维数组 * @param a3 int整型一维数组 * @param m int整型一维数组 * @return int整型 */ public int solve (int n, int[] a1, int[] a2, int[] a3, int[] m) { int[][] dp = new int[4][n+1]; dp[1][1] = a1[0]; dp[2][1] = a2[0]; dp[3][1] = a3[0]; for(int j=2;j<=n;j++){ dp[1][j] = a1[j-1] + Math.max(dp[1][j-1], dp[2][j-1] - m[j-2]); dp[2][j] = a2[j-1] + Math.max(dp[2][j-1], Math.max(dp[1][j-1], dp[3][j-1]) - m[j-2]); dp[3][j] = a3[j-1] + Math.max(dp[3][j-1], dp[2][j-1] - m[j-2]); } return Math.max(dp[1][n], Math.max(dp[2][n], dp[3][n])); } }
class Solution: def solve(self, n, a1, a2, a3, m): # write code here a = (a1, a2, a3) cd = len(m) res_sum = 0 # 这个是列,找出每一列 for j in range(0, n): mx = [] # 这个是行,找出每一行中的数 for i in range(0, 3): mx.append(a[i][j]) # 这个结果是每列最大数的总和 res_sum += max(mx) num1, num2, num3 = 0, 0, 0 # 计算第一行的总和 for j in range(0, n): mx = [] mx.append(a[0][j]) # 这个结果是每列最大数的总和 num1 += sum(mx) # 计算第二行的总和 for j in range(0, n): mx = [] mx.append(a[1][j]) # 这个结果是每列最大数的总和 num2 += sum(mx) # 计算第三行的总和 for j in range(0, n): mx = [] mx.append(a[2][j]) # 这个结果是每列最大数的总和 num3 += sum(mx) hf = 0 for i in range(0, cd - 1): hf += m[i] max1 = res_sum - hf min = (num1, num2, num3) for i in min: if i >= max1: max1 = i max_z = max1 return max_z
public int solve (int n, int[] a1, int[] a2, int[] a3, int[] m) { int[][] dp=new int[3][n]; dp[0][0]=a1[0]; dp[1][0]=a2[0]; dp[2][0]=a3[0]; for(int i=1;i<n;i++){ dp[0][i]=Math.max(dp[0][i-1],dp[1][i-1]-m[i-1])+a1[i]; dp[1][i]=Math.max(Math.max(dp[0][i-1],dp[2][i-1])-m[i-1],dp[1][i-1])+a2[i]; dp[2][i]=Math.max(dp[2][i-1],dp[1][i-1]-m[i-1])+a3[i]; } return Math.max(Math.max(dp[0][n-1],dp[1][n-1]),dp[2][n-1]); }