1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class Solution { public: int maxProfit(int n, vector<int>& present, vector<int>& future, vector<vector<int>>& hierarchy, int budget) { int dp[3][170][170]; for(int i=1;i<=2;++i){ for(int j=0;j<=n+5;++j){ for(int k=0;k<=budget+5;++k){ dp[i][j][k]=0; } } } vector<vector<int> > g(n+5); for(auto &t:hierarchy){ g[t[0]].push_back(t[1]); } auto dfs=[&](this auto &&self,int u,int p)->void{ for(auto v:g[u]){ if(v==p) continue; self(v,u); } vector<array<int,3> > memo(budget+5,{0,0,0}); for(auto &v:g[u]){ for(int i=budget;i>=0;--i){ for(int j=0;j<=i;++j){ memo[i][1]=max(memo[i][1],memo[i-j][1]+dp[1][v][j]); memo[i][2]=max(memo[i][2],memo[i-j][2]+dp[2][v][j]); } } } for(int i=budget;i>=0;--i){ for(int j=1;j<=2;++j){ int cost=present[u-1]/j; dp[j][u][i]=max(dp[j][u][i],memo[i][1]); if(i>=cost){ dp[j][u][i]=max(dp[j][u][i],future[u-1]-cost+memo[i-cost][2]); } } } }; dfs(1,1); int ans=0; for(int i=budget;i>=0;--i){ ans=max({ans,dp[1][1][i]}); } return ans; } };
|