标签:
public static int maxValue(int[]v,int n){ int[][] dp = new int[n][n];//记录i-j中可以选择的最大值 int[][] record = new int[n][n];//记录 i-j中,使得选择的结果最大的 那个 选中值的位置 for(int i=0;i<n;i++){ dp[i][i]=v[i]; record[i][i]=i; } for(int i=2;i<=n;i++){// 当前剩余硬币数量的遍历!!!!从两个开始,3,4,,,,直到长度n。 for(int s=0;(s+i)<=n;s++){//起始位置遍历 int e=i+s-1; //当前结束为止 int num1=v[s],num2=v[e];//首、尾的值 if(i>=3){// 长度超过2时,需要考虑剩余硬币中能拿到的钱数 //假设拿第一个 if(record[s+1][e]==s+1)//第二个人会拿剩余的里面的第一个 num1+=dp[s+2][e]; else// 第二个人会拿剩余的里面的最后一个 num1 +=dp[s+1][e-1]; //假设拿最后一个 if(record[s][e-1]==s)//同上 num2 += dp[s+1][e-1]; else //同上 num2 +=dp[s][e-2]; } record[s][e]=(num1>num2)?s:e;//长度为i的选择中,选择综合值大的那个,做为选取目标 dp[s][e]=(num1>num2)?num1:num2;// } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ System.out.print(dp[i][j]+" "); } System.out.println(); } return dp[0][n-1]; }
标签:
原文地址:http://www.cnblogs.com/todayjust/p/5842383.html