招商银行专场竞赛

该篇博客探讨了一种使用滚动数组优化的动态规划方法,应用于解决购物优惠问题。代码展示了一个C++实现,通过滚动数组减少了空间复杂度,提高了算法效率。核心在于如何在迭代过程中更新状态转移矩阵,并找到最优解。
摘要由CSDN通过智能技术生成

题目链接

题解链接

补充下第四题的滚动数组版

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值