做菜顺序
像这种多决策问题的第一想法其实是回溯,这种多决策往往可以在dp的时候将某个状态作为附加维度。
DP方程:
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最大,如果再选一件物品,值更大的话,实际上就要保证,
即要求 ,只有在这个时候,才会去选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;
}
};