博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划 选择硬币使得价值最大
阅读量:4562 次
发布时间:2019-06-08

本文共 1205 字,大约阅读时间需要 4 分钟。

 

动态规划
第一个人每次都选择   当前+之后可以拿到的  最大的值
当第一个人选择完成后,第二个人用同样的策略拿剩下的硬币中  当前+之后可以拿到的  最大的值
用dp[i][j]记录在还剩v[i]~v[j]时,先拿的人可以最多拿多少钱
用record[i][j]记录在还剩v[i]~v[j]时,先拿的人选择了哪一个 只有i和j两种可能
 
当只剩1个硬币的时候: dp[i][i] = v[i]    //只能拿这个,无悬念
当只剩2个硬币的时候: dp[i][i + 1] = max(v[i], v[i + 1])    //一定选最大的
当剩余硬币>=3个时,需要知道第二个人的策略: dp[i][j] = max(拿第一个 + 第二个人选择后剩下的能够拿到的最大值,  拿最后一个 + 第二个人选择后剩下的能够拿到的最大值)
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
=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

 

转载于:https://www.cnblogs.com/todayjust/p/5842383.html

你可能感兴趣的文章
经常使用的android弹出对话框
查看>>
确保新站自身站点设计的合理性的六大注意点
查看>>
1033. 旧键盘打字(20)
查看>>
The Zen of Python
查看>>
git安装及使用
查看>>
mysql一个非常实用解决sql查询优化的函数explain
查看>>
图文讲解NTFS和FAT32硬盘下 asp.net 生成word 错误: 80070005 和 错误:8000401a 的解决方法...
查看>>
《学习》5连接查询(高级查询)
查看>>
[BZOJ2730][HNOI2012]矿场搭建 点双 割点
查看>>
Linux/Mac 挂载远程服务器目录到本地
查看>>
1,实现在线答题 2,答题结束后可以判断对错 3,并将错题的结果保存起来。...
查看>>
JS中原始值和引用值的储存方式
查看>>
初学C#的简单编程题合集(更新)
查看>>
Linux学习闲谈(一)——Shell基本操作与命令
查看>>
写日志文件
查看>>
python的常用库及文档使用
查看>>
ArcGIS 中要素的查询与修改
查看>>
linux环境下apache2与tomcat6的负载配置
查看>>
powerdesigner相关概念理解
查看>>
求DNA序列中各个碱基的含量
查看>>