楼主: printf_ll
跳转到指定楼层
上一主题 下一主题
收起左侧

11/23 狗家 onsite

🔗
waikai 2016-11-26 10:32:09 | 只看该作者
全局:
catinclay 发表于 2016-11-26 09:23
哈哈 我說的二維dp是palindrome那題
另一題確實是要三維dp

请问怎么二维啊。没啥思路,只想到一个N^3的解答
回复

使用道具 举报

🔗
catinclay 2016-11-26 13:03:09 | 只看该作者
全局:
waikai 发表于 2016-11-26 10:32
请问怎么二维啊。没啥思路,只想到一个N^3的解答

```
dp[l][r] 代表 substring(l,r)所需要的最少插入
if(char[l] == char[r]), dp[l][r] = dp[l+1][r-1]  // 把char[l]跟char[r]都去掉
if(char[l] != char[r]), dp[l][r] = min(dp[l][r-1], dp[l+1][r])+1 //把char[l]或char[r]插入到另一邊, 取比較小的
```
回复

使用道具 举报

🔗
catinclay 2016-11-26 13:11:34 | 只看该作者
全局:
moonstone 发表于 2016-11-26 06:19
第三题
skip is the min distance end at i(i is skipped) with j skips
noSkip is the min distance end ...

wow, 這樣好像可以二維dp解.... awesome

补充内容 (2016-11-26 13:13):
不對...看了一下 好像會有問題..

补充内容 (2016-11-26 13:19):
關鍵在noSkip[i,j]不一定會由 skip[i - 1, j - 1] + dst[sLast[i - 1, j - 1], i] 組成
回复

使用道具 举报

🔗
waikai 2016-11-26 13:30:17 | 只看该作者
全局:
catinclay 发表于 2016-11-26 13:03
```
dp[l][r] 代表 substring(l,r)所需要的最少插入
if(char[l] == char[r]), dp[l][r] = dp[l+1][r-1] ...

明白了。谢谢。就是第二个if好像不应该用,对于char[l] == char[r]的时候也需要检查 dp[l][r-1], dp[l+1][r]
回复

使用道具 举报

🔗
moonstone 2016-11-26 14:08:18 | 只看该作者
全局:
catinclay 发表于 2016-11-26 13:11
wow, 這樣好像可以二維dp解.... awesome

补充内容 (2016-11-26 13:13):

为什么呀 能举个反例么
回复

使用道具 举报

🔗
catinclay 2016-11-26 15:11:04 | 只看该作者
全局:
waikai 发表于 2016-11-26 13:30
明白了。谢谢。就是第二个if好像不应该用,对于char[l] == char[r]的时候也需要检查 dp[l][r-1], dp[l+1] ...

額...為什麼?字數字數
回复

使用道具 举报

🔗
catinclay 2016-11-26 15:14:01 | 只看该作者
全局:
moonstone 发表于 2016-11-26 14:08
为什么呀 能举个反例么

假設四個點 1, 2, 3, 4, 跳過兩個點的情況可能是跳過1, 4 最好 但第五個點加進來的時候 有可能是跳過3 4 5更好

补充内容 (2016-11-26 15:16):
說錯了 是可能跳過 2 3 4 更好 因為可能 2 5的distance特大
回复

使用道具 举报

🔗
hellojay 2016-11-27 09:06:00 | 只看该作者
全局:
不知道是不是我理解错了,第四题的话插入的最小个数不就是原字符串里奇数个字符数量减一

补充内容 (2016-11-27 09:23):
无视我,我想到反例了
回复

使用道具 举报

🔗
laiguojiuhao 2016-11-27 09:50:35 | 只看该作者
全局:
catinclay 发表于 2016-11-26 15:14
假設四個點 1, 2, 3, 4, 跳過兩個點的情況可能是跳過1, 4 最好 但第五個點加進來的時候 有可能是跳過3 4  ...

但是你跳过2,3,4不是跳过三个点了吗,sLast和跳两个点的情况是不一样的吧?
对于1,2,3,4没有办法跳过三个点,所以三个点对于1,2,3,4,5是新的情况,再加一个判断应该可以吧。我感觉二维dp应该是够的

补充内容 (2016-11-27 10:00):
就是noSkip(i, j) 增加一个 dst(i-j-1, i) 的最小值candidate
回复

使用道具 举报

🔗
catinclay 2016-11-27 11:36:25 | 只看该作者
全局:
把第三面的題目試了寫了, 用的是二維dp但複雜度是n^3
試著加了comment, 但感覺解釋的不太好..要是有人看懂了覺得可以解釋得更好的可以給我些comment意見
要是看不懂的可以一起討論下

  1.         // getShortestDistance(點的數量, 可跳過的點的數量, 距離矩陣)
  2.         // dis[i][j] 代表node i 與 node j的距離
  3.         // 點的數量n 代表點的編號為 1, 2, 3, 4...n
  4.         public static int getShortestDistance(int n, int skipNum, int[][] dis){

  5.                 // dp[當前path的最後一個點][跳過點的數量]
  6.                 int[][] dp = new int[n+1][skipNum+1];

  7.                 // 初始化所有“不跳過任何點”的距離
  8.                 for(int i = 1; i <= n;++i){
  9.                         dp[i][0] = dp[i-1][0] + dis[i-1][i];
  10.                 }

  11.                 // 處理node(i), 也就是以node(i) 為path最後一個點的情況
  12.                 // 從node(1) 開始處理到node(n)
  13.                 for(int i = 1; i <= n; ++i){

  14.                         // 跳過了j個點
  15.                         // 從跳過1個node開始到處理跳過skipNum個node
  16.                         for(int j = 1; j <= skipNum && j < i;++j){

  17.                                 // 不跳過第node(n-1) 的情況, 距離為dp[i-1][j] + dis[i-1][i]
  18.                                 dp[i][j] = dp[i-1][j]+dis[i-1][i];

  19.                                 // 最後一個點之前, 連續跳過了k個點的情況
  20.                                 // eg: k = 2, i = 10的情況, 代表跳過了node (8) 跟node (9)
  21.                                 // 此時距離會是:
  22.                                 // 處理到node(7), 跳過j-2個點 + node(7)到node(10)的距離 (跳過兩個點, 8與9)
  23.                                 //       dp[7][j-2]         +        dis[7][10]
  24.                                 for(int k = 1; k <= j; ++k){
  25.                                         // 把k=1~j的所有情況取最小值
  26.                                         // dp[i-k-1][j-k]
  27.                                         dp[i][j] = Math.min(dp[i][j], dp[i-k-1][j-k] + dis[i-k-1][i]);
  28.                                 }
  29.                         }
  30.                 }

  31.                 // 把所有處理到node(n)的情況取最小值
  32.                 // path的最後一個點從node(n - skipNum) ~ node(n) 都有可能, 這裏用k當作變數
  33.                 int ans = Integer.MAX_VALUE;
  34.                 for(int k = n-skipNum; k <= n; ++k){
  35.                         // 跳過的node數則會是skipNum-(n-k)
  36.                         // eg: 假如最後一個node是 node(n-2), 及代表node(n-1)跟node(n)被跳過
  37.                         // 此時要看的就是dp[n-2][skipNum-2]
  38.                         ans = Math.min(ans, dp[k][skipNum-(n-k)]);
  39.                 }
  40.                 return ans;
  41.         }

  42. }
复制代码
回复

使用道具 举报

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

本版积分规则

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