算法: 有一堆纸币,自己和对方都只能选择纸币中最大的或纸币中最小的,用动态规划法求出怎样自己才能拿到最多的钱

public class Four {

static int N = 100;

static int[] v = {1,2,3,4,5,6,7,8,7,10};


static int[][] maxValue = new int[N][N];


static int[][] select = new int[N][N];


public static void main(String[]args){
maxValue(v,10);
}

static int maxValue(int[]v,int n){

int i, j, len;


   for(i = 0; i < n; i++){


       maxValue[i][i] = v[i];


       select[i][i] = i;
   
   }


   for(i = 0; i < n - 1; i++){


       if(v[i] > v[i + 1]){


           maxValue[i][i + 1] = v[i];


           select[i][i + 1] = i;


       }


       else{


           maxValue[i][i + 1] = v[i + 1];


           select[i][i + 1] = i + 1;


       }


   }


   for(len = 3; len <= n; len++){


       for(i = 0; i < n - len + 1; i++){


           j = i + len - 1;


           int first = 0, last = 0;


           if(select[i + 1][j] == j)


               first = v[i] + maxValue[i + 1][j - 1];


           else if(select[i + 1][j] == i + 1)


               first = v[i] + maxValue[i + 2][j];


           if(select[i][j - 1] == i)


               last = maxValue[i + 1][j - 1] + v[j];


           else if(select[i][j - 1] == j - 1)


               last = maxValue[i][j - 2] + v[j];


           if(first > last){


               maxValue[i][j] = first;


               select[i][j] = i;


           }


           else{


               maxValue[i][j] = last;


               select[i][j] = j;


           }


       }


   }


   return maxValue[0][n - 1];


}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值