leetcode-956. 最高的廣告牌


https://leetcode-cn.com/contest/weekly-contest-114/problems/tallest-billboard/

給出一個集合,詢問能否挑出兩個不重疊的子集,使得兩個子集內的數字和一樣,求數字和最大是多少。

一開始枚舉所有集合然后dp一波果斷T了。

正解是f(i,j)表示前i個數字,組成的兩個集合差為j的時候較大的集合內的數字和,然后枚舉一下三種情況dp即可。

一開始少算了一種情況,是把第i加在較小的集合里,仍沒超過較大的集合。

 1 class Solution {
 2 public:
 3     #define inf 0x3f3f3f3f
 4     int tallestBillboard(vector<int>& rods) {
 5         int f[21][5005];
 6         memset(f,-inf,sizeof(f));
 7         f[0][0]=0;
 8         for(int i=0;i<rods.size();++i){
 9             for(int j=0;j<=5000;++j){
10                 f[i+1][j]=max(f[i+1][j],f[i][j]);
11                 if(j>=rods[i]&&f[i][j-rods[i]]!=-inf)f[i+1][j]=max(f[i+1][j],rods[i]+f[i][j-rods[i]]);
12                 if(rods[i]>=j&&f[i][rods[i]-j]!=-inf)f[i+1][j]=max(f[i+1][j],j+f[i][rods[i]-j]);
13                 if(j+rods[i]<=5000&&f[i][j+rods[i]])f[i+1][j]=max(f[i+1][j],f[i][j+rods[i]]);
14             }
15         }
16         return max(0,f[rods.size()][0]);
17     }
18 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM