代码随想录算法训练营第四十六天

昨天媳妇发烧啦,和他一顿激烈讨论该不该母乳,目前一切良好,题目在单位做完了,但是有个地方想在家里测试一下。

139.单词拆分

要注意先背包后物品,并且物品是变化的,不是直接用wordDict

复制代码
#include <iostream>
#include <unordered_set>
#include <vector>
using namespace ::std;

class Solution
{
public:
    bool wordBreak(string s, vector<string> &wordDict)
    {
        unordered_set<string> WD(wordDict.begin(), wordDict.end());
        vector<bool> dp(s.size() + 1, 0);
        dp[0] = 1;
        for (int j = 1; j < s.size() + 1; j++)
        {
            for (int i = 0; i < j; i++)
            { // 这里的遍历物品还需要思考一下,不太像正常的物品
                string str = s.substr(i, j - i);
                if (WD.find(str) != WD.end() && dp[i] == true)
                {
                    dp[j] = true;
                    for (int ii = 0; ii < s.size() + 1; ii++)
                    {
                        cout << dp[ii] << ' ';
                    }
                    cout << "end" << endl;
                    cout << j << endl;
                    cout << str << endl;
                }
            }
        }

        // print

        return dp[s.size()];
    }
};
int main()
{
    Solution syz;
    string s1 = "applepenapple";
    vector<string> wordDict1;
    string a1 = "apple";
    string a2 = "pen";
    wordDict1.push_back(a1);
    wordDict1.push_back(a2);
    syz.wordBreak(s1, wordDict1);
    return 0;
}

这里想试个东西,总感觉s.substr(j-i)的长度不太对。

这里真的用的好巧啊,例子用applepenapple。

//首先dp[0]是1毋庸置疑,然后j = 5,即长度5时出现第二个dp[5] = 1,实际上s[5] = p,刚好是下一个开头

1 0 0 0 0 1 0 0 0 0 0 0 0 0 end

5

apple

//然后j = 8的时候,即长度3时,出现第三个dp[8] = 1,s[8] = a,循环上了。

1 0 0 0 0 1 0 0 1 0 0 0 0 0 end

8

pen

1 0 0 0 0 1 0 0 1 0 0 0 0 1 end

13

apple

想说的就是,正好dp[x]中的x,是下一个起始位,所以没有那么多的±1来对齐的问题。最后直接看dp[s.size()]即可。

动态规划:关于多重背包,你该了解这些!

卡码网第56题 (opens new window)

复制代码
#include<iostream>
#include<vector>
using namespace::std;
int main(){
    int C;
    int N;
    cin >> C >> N;
    vector<int>w(N,0);
    vector<int>v(N,0);
    vector<int>k(N,0);
    for(int i = 0; i< N ;i++){
        cin >> w[i];
    }
    for(int i = 0; i< N ;i++){
        cin >> v[i];
    }
    for(int i = 0; i< N ;i++){
        cin >> k[i];
    }
    vector<int>dp(C+1,0);
    for(int i = 0;i < N;i++){
        for(int j = C;j >= w[i];j--){ //这里忘记考虑01背包要从后往前
            for(int kk = 1;kk <= k[i];kk++){
                //这里忘记考虑 =的情况
                if(j >= kk * w[i])dp[j] = max(dp[j],dp[j - kk * w[i]] + kk * v[i]);
            }
        }
    }
    cout << dp[C] << endl;
    return 0;
}
相关推荐
阳光_你好12 分钟前
请详细说明opencv/c++对图片缩放
c++·opencv·计算机视觉
杰克逊的黑豹19 分钟前
不再迷茫:Rust, Zig, Go 和 C
c++·rust·go
雾月5522 分钟前
LeetCode 914 卡牌分组
java·开发语言·算法·leetcode·职场和发展
想跑步的小弱鸡26 分钟前
Leetcode hot 100(day 4)
算法·leetcode·职场和发展
Fantasydg27 分钟前
DAY 35 leetcode 202--哈希表.快乐数
算法·leetcode·散列表
jyyyx的算法博客28 分钟前
Leetcode 2337 -- 双指针 | 脑筋急转弯
算法·leetcode
Y.O.U..33 分钟前
今日八股——C++
开发语言·c++·面试
SweetCode39 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
ゞ 正在缓冲99%…1 小时前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong1 小时前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划