LeetCode 1402. 做菜顺序 (排序+DP || 贪心)

做菜顺序
像这种多决策问题的第一想法其实是回溯,这种多决策往往可以在dp的时候将某个状态作为附加维度。
DP方程:
d p [ i ] [ j ] = m a x ( d p [ i 1 ] [ j 1 ] + a [ i ] j , d p [ i 1 ] [ j ] ) dp[i][j] = max(dp[i-1][j-1]+a[i]*j,dp[i-1][j])

class Solution {
public:
    int maxSatisfaction(vector<int>& a) {
        sort(a.begin(),a.end());
        int n = a.size();
        vector<vector<int>> dp(n+1,vector<int>(n+1,-1e9));
        for(int i=0;i<=n;i++){
            dp[i][0] = 0;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                dp[i][j] = max(dp[i-1][j-1]+a[i-1]*j,dp[i-1][j]);
            }
        }
        int ans = 0;
        for(int j=1;j<=n;j++){
            ans = max(ans,dp[n][j]);
        }
        return ans;
    }
};

/* 
-9 -8 -1 0 5
dp[i][dpt] = dp[i-1][dpt-1]+a[i]*dpt;
dp[i][dpt-1] = dp[i-1][dpt-2]+a[i]*(dpt-1);
*/
  • 贪心
    s2+2s1最大,如果再选一件物品,值更大的话,实际上就要保证,
    s 3 + 2 s 2 + 3 s 1 > s 2 + 2 s 1 s3+2s2+3s1>s2+2s1
    即要求 s 3 + s 2 + s 1 > 0 s3+s2+s1>0 ,只有在这个时候,才会去选s3。
    贪心有点难想
class Solution {
public:
    int maxSatisfaction(vector<int>& a) {
        sort(a.begin(),a.end());
        reverse(a.begin(),a.end());
        int ans = 0 ,pre = 0;
        for(int i=0;i<a.size();i++){
            if(pre+a[i]>0){
                pre += a[i];
                ans += pre;
            }else{
                break;
            }
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/107578095
今日推荐