public class test_5{
public static void main(String[] args){
int[] arry = new int[]{1,2,3,4,5,6};
System.out.println(fun(arry,0,5));
}
//自底向顶的动态规划
public static int fun(int[] arry ,int low,int high){
if(high<0)
return 0;
int[] dp_1=new int[high+1];
int[] dp_2=new int[high+1];
dp_1[0]=-arry[0];
dp_2[0]=0;
for(int i=1;i<arry.length-1;i++){
dp_1[i]= dp_2[i-1] -arry [i] > dp_1[i-1]?dp_2[i-1] -arry [i] : dp_1[i-1];
dp_2[i]= dp_2[i-1] > dp_1[i-1] + arry[i]?dp_2[i-1] : dp_1[i-1] + arry[i];
}
return dp_1[high-1]+arry[high]>dp_2[high-1] ? dp_1[high-1]+arry[high]:dp_2[high-1];
}
/*暴力递归
public static int fun(int[] arry ,int low,int high){
if(high<0)
return 0;
int p1=f(arry,0,high-1)+arry[high];
int p2=g(arry,0,high-1);
return p1>p2 ? p1:p2;
}
public static int f(int[] arry ,int low,int high){
if(high==0)
return -arry[high];
int p1=g(arry,low,high-1)-arry[high];
int p2=f(arry,low,high-1);
return p1>p2 ? p1:p2;
}
public static int g(int[] arry ,int low,int high){
if(high==0)
return 0;
int p1=g(arry,low,high-1);
int p2=f(arry,low,high-1)+arry[high];
return p1>p2 ? p1:p2;
}
*/
/*记忆化搜索————带缓存表的
public static int fun(int[] arry ,int low,int high){
if(high<0)
return 0;
int[] dp_1=new int[high+1];
int[] dp_2=new int[high+1];
for(int i=0;i<arry.length;i++){
dp_1[i]=-1;
dp_2[i]=-1;
}
int p1=f(arry,0,high-1,dp_1,dp_2)+arry[high];
int p2=g(arry,0,high-1,dp_1,dp_2);
return p1>p2 ? p1:p2;
}
public static int f(int[] arry ,int low,int high,int[] dp_1,int[] dp_2){
if(dp_1[high]!=-1)
return dp_1[high];
int ans =0;
if(high==0)
ans = -arry[high];
else{
int p1=g(arry,low,high-1,dp_1,dp_2)-arry[high];
int p2=f(arry,low,high-1,dp_1,dp_2);
ans = p1>p2 ? p1:p2;
}
dp_1[high]=ans;
return dp_1[high];
}
public static int g(int[] arry ,int low,int high,int[] dp_1,int[] dp_2){
if(dp_2[high]!=-1)
return dp_2[high];
int ans =0;
if(high==0)
ans=0;
else{
int p1=g(arry,low,high-1,dp_1,dp_2);
int p2=f(arry,low,high-1,dp_1,dp_2)+arry[high];
ans = p1>p2 ? p1:p2;
}
dp_2[high]=ans;
return dp_2[high];
}
*/
}