找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
尊貴會員無限下載附件伊莉需要你的贊助和支持搞笑、娛樂、精彩的影片讓你看
蘿莉fc2明日花中文旬果母乳rpg
怪盗エフblackhea魔法姫士stranded女兒mirror天晴乃愛

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

[繁]月光下的異世界之

[繁]轉生為第七王子,

[繁]關於我轉生變成史

[繁]身為魔王的我娶了

黑人男子拒絕出示駕照

高雄苓雅復興二路與四
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 2022|回復: 4
打印上一主題下一主題

[問題]一個題目code的觀念解釋[複製鏈接]

st474ddr 該用戶已被刪除
跳轉到指定樓層
樓主
發表於 2016-5-23 01:40 AM|只看該作者|倒序瀏覽
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。
本帖最後由 snowflying 於 2016-5-23 02:13 AM 編輯

題目如下:


Independent SET in a path


For a graph G = (V,E), asubSET U of V is an independent SET if there is no edge (v1,v2) forany v1 and v2 in U. Finding the maximum independent SET of a graph is animportant but very difficult problem. However, the problem can be easily solvedwhen the graph is special.

...
瀏覽完整內容,請先 註冊登入會員

點評

snowflying 變斜體了  發表於 2016-5-23 01:46 AM
分享分享0收藏收藏0支持支持0
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3224
積分
24366 點
潛水值
77420 米
頭香
發表於 2016-5-23 02:45 AM|只看該作者
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
本帖最後由 snowflying 於 2016-5-23 02:55 AM 編輯

如果用 dp + 遞迴 的話,大概長這樣,程式碼也不會太長

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define print printf
  5. using namespace std;

  6. int arr[512];
  7. int dp[512];

  8. int findMaxSum(int idx, int n)
  9. {
  10.     if(idx >= n)
  11.         return 0;
  12.         
  13.     if(dp[idx] != -1)
  14.         return dp[idx];
  15.         
  16.     return dp[idx] = max(arr[idx] + findMaxSum(idx+2, n), findMaxSum(idx+1, n));
  17. }

  18. int main()
  19. {
  20.     int n;
  21.    
  22.     while(scanf("%d", &n) == 1 && n != 0)
  23.     {
  24.         for(int i = 0 ; i < n ; ++i)
  25.             scanf("%d", arr + i);
  26.             
  27.         memset(dp, 0xff, sizeof(dp));
  28.         print("%d\n", findMaxSum(0, n));
  29.     }
  30. }
複製代碼


這可以寫迴圈版本,而且不需要用到陣列
原本的遞迴式相當於 dp[ i ] = max(arr[ i ] + dp[i + 2], dp[i + 1])   (邊界自行處理)
而由左往右處理,與由右往左處理,答案不會變
所以可以寫成 dp[ i ] = max(arr[ i ] + dp[i - 2], dp[i - 1])
也就是說,只要一直記錄前兩筆就行了

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define print printf
  5. using namespace std;

  6. int main()
  7. {
  8.     int n, arr[512], rec[2], tmp;
  9.    
  10.     while(scanf("%d", &n) == 1 && n != 0)
  11.     {
  12.         for(int i = 0 ; i < n ; ++i)
  13.             scanf("%d", arr + i);
  14.             
  15.         if(n == 1)
  16.         {
  17.             print("%d\n", arr[0]);
  18.             continue;
  19.         }
  20.         
  21.         rec[0] = arr[0];
  22.         rec[1] = max(arr[0], arr[1]);
  23.         
  24.         for(int i = 2 ; i < n ; ++i)
  25.         {
  26.             tmp = max(arr[i] + rec[0], rec[1]);
  27.             rec[0] = rec[1];
  28.             rec[1] = tmp;
  29.         }
  30.         print("%d\n", rec[1]);
  31.     }
  32.     return 0;
  33. }
複製代碼


那份程式碼的概念也差不多是這樣

m1[ i ] 是 m3[i - 1]

m2[ i ] = m1[i - 1] + a[ i ];
所以 m2[ i ] 是 m3[i - 2] + a[ i ]

最後 m3[ i ] = max(m1[ i ], m2[ i ]);
即 m3[ i ] = max(m3[ i - 1],  m3[i - 2] + a[ i ])
跟上面的 dp[ i ] = max(arr[ i ] + dp[i - 2], dp[i - 1]) 一樣的意思
只是這並不需要開到 3 個陣列,而且跑的時候只需要前兩筆的資訊
所以開 3 個變數就行了

...
瀏覽完整內容,請先 註冊登入會員
Melty Snow [雪靈]
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

inunu 該用戶已被刪除
3
發表於 2016-5-23 01:06 PM|只看該作者
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
本帖最後由 inunu 於 2016-5-23 01:13 PM 編輯

這題的解法概念大概是這樣
從第一個項目開始, 求出各項目的最大積分
直到求出最後一個項目為止
所以你要用迴圈還是遞迴, 老實說只看你自己偏好習慣

我們用 4 10 9 1 7 的例子來講
最前面的 4 只是長度, 略過不看
那我們先說  A[] = {10, 9, 1, 7} 是每個項目本身的分數
...
瀏覽完整內容,請先 註冊登入會員
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3224
積分
24366 點
潛水值
77420 米
4
發表於 2016-5-23 10:09 PM|只看該作者
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com
inunu 發表於 2016-5-23 01:06 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

這題的解法概念大概是這樣
從第一個項目開始, 求出各項目的最大積分
直到求出最後一個項目為止

S[1] = max(A[0], A[1]);
...
瀏覽完整內容,請先 註冊登入會員
Melty Snow [雪靈]
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。

使用道具檢舉

inunu 該用戶已被刪除
5
發表於 2016-5-24 05:33 AM|只看該作者
本帖最後由 inunu 於 2016-5-24 05:49 AM 編輯

S[2] 本身並不是二選一的局面
我選擇了分開處理而不是進行檢查
這單純只是個人偏好

沒錯, 我昨天漏講了一個部份就是我的 S[k] 是 "包含了 k 項目" 的最大積分, 必需包含該項目
因此如你所說, 最後答案也必需有兩個選擇, 包含或不包含最後項目
也就是:
甲. S[n - 1]
...
瀏覽完整內容,請先 註冊登入會員





分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部