123
返回列表 发新帖
楼主: ruochenzhang
跳转到指定楼层
上一主题 下一主题
收起左侧

SnapChat 电面挂经

🔗
liliangfighting 2016-10-27 23:41:31 | 只看该作者
全局:
满城尽带黄金甲 发表于 2016-9-5 02:21
有个问题,如果是[5, 7, 8, 5]这个subarray, B先拿,那么它会拿哪个?如果B拿第一个5,那么A可以在剩下的 ...

你考虑的这个跟我想法一样, 所以我对上面的解法有一些疑问.

我觉得如果轮到B取的时候, 如果coin[i] == coin[j], 此时我们不能默认B就取 i 或 j (上面的解法把== 归到了> or < 的情况, 我觉得是不对的), 而是我们应该假定B取得结果使得A剩余的能取得的最大值最小.

个人解法:
  1. public static int takeMost(int[] coins){
  2.                 int n = coins.length;
  3.                 int[][] dp = new int[n+2][n+2];
  4.                 for(int j=0; j<n; j++){
  5.                         for(int i=j; i>=0; i--){
  6.                                 if(i >= j-1){
  7.                                         dp[i][j] = Math.max(coins[i], coins[j]);
  8.                                 } else{         // <----  i <= j - 2
  9.                                         // A takes coins[i]
  10.                                         int opt1 = coins[i];
  11.                                         if(coins[i+1] > coins[j]){
  12.                                                 opt1 += dp[i+2][j];
  13.                                         } else if (coins[i+1] < coins[j]){
  14.                                                 opt1 += dp[i+1][j-1];
  15.                                         } else{
  16.                                                 opt1 += Math.min(dp[i+2][j], dp[i+1][j-1]);
  17.                                         }
  18.                                         // A takes coins[j]
  19.                                         int opt2 = coins[j];
  20.                                         if(coins[i] > coins[j-1]){
  21.                                                 opt2 += dp[i+1][j-1];
  22.                                         } else if(coins[i] < coins[j-1]){
  23.                                                 opt2 += dp[i][j-2];
  24.                                         } else {
  25.                                                 opt2 += Math.min(dp[i][j-2], dp[i+1][j-1]);
  26.                                         }
  27.                                         dp[i][j] = Math.max(opt1, opt2);                                               
  28.                                 }                                       
  29.                         }
  30.                 }
  31.                 return dp[0][n-1];
  32.         }
复制代码
回复

使用道具 举报

🔗
kin332026 2016-11-23 09:11:38 | 只看该作者
全局:
recursion + memorization
时间复杂度应该是O(n^2) 应该是最优解吧
个人愚解,大家看看是这样的吗
回复

使用道具 举报

🔗
jyty 2017-1-4 14:28:59 | 只看该作者
全局:
ykwwind 发表于 2016-4-19 07:01
补充内容 (2016-4-19 07:02):
感觉最近都是这种路数..........

最近是什么路数?没看出来啊。。
回复

使用道具 举报

🔗
yugioh 2017-8-14 14:13:48 | 只看该作者
全局:
Leetcode 486
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表