补充下第四题的滚动数组版
class Solution {
public:
typedef long long ll;
int goShopping(vector<int>& A, vector<int>& B) {
int n = A.size();
vector<pair<int, int>> p(n);
for(int i = 0; i < n; i++) p[i] = {B[i], A[i]};
sort(p.begin(), p.end(), greater<pair<int, int>>());
vector<vector<ll>> dp(4, vector<ll>(3, 1e10));
dp[0][0] = 0;
for(int i=0;i<n;++i){
vector<vector<ll>> tmp(4, vector<ll>(3, 1e10));
for(int j=0;j<=3;++j){
for(int k=0;k<3;++k){
tmp[min(j+1,3)][k] = min(tmp[min(j+1,3)][k], dp[j][k] + p[i].second * 7);
tmp[j][(k+1)%3] = min(tmp[j][(k+1)%3], dp[j][k] + (k == 2 ? 0 : p[i].first * 10));
}
}
dp = tmp;
}
ll ans = 1e10;
for(int k=0;k<3;++k){
ans = min(ans,dp[3][k]);
}
ans /= 10;
dp = vector<vector<ll>>(4, vector<ll>(3, 1e10));
dp[0][0]=0;
for(int i=0;i<n;++i){
vector<vector<ll>> tmp(4, vector<ll>(3, 1e10));
for(int j=0;j<3;++j){
for(int k=0;k<3;++k){
if(j+1<3) tmp[j+1][k] = min(tmp[j+1][k], dp[j][k] + p[i].second);
tmp[j][(k+1)%3] = min(tmp[j][(k+1)%3], dp[j][k] + (k == 2 ? 0 : p[i].first));
}
}
dp = tmp;
}
for(int j=0;j<3;++j){
for(int k=0;k<3;++k){
ans = min(ans,dp[j][k]);
}
}
return ans;
}
};