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

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

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;
}
相关推荐
双叶83636 分钟前
(51单片机)LCD展示动画(延时函数)(LLCD1602教程)
c语言·数据库·c++·单片机·嵌入式硬件·51单片机
愚润求学1 小时前
【数据结构】哈希表
数据结构·c++·笔记·散列表
倔强的石头1061 小时前
【C++指南】位运算知识详解
java·开发语言·c++
SophiaSSSSS2 小时前
无标注文本的行业划分(行业分类)算法 —— 无监督或自监督学习
学习·算法·分类
mozun20202 小时前
QT:Qt5 串口模块 (QSerialPort) 在 VS2015 中正确关闭串口避免被占用
开发语言·c++·qt·串口·串口调试·上位机软件
byte轻骑兵2 小时前
【C++ 类和数据抽象】static 类成员
开发语言·c++
努力学习的小廉2 小时前
【C++】 —— 笔试刷题day_24
开发语言·c++
明月清了个风2 小时前
数据结构与算法学习笔记(Acwing提高课)----动态规划·数字三角形
笔记·学习·算法·动态规划
刃神太酷啦2 小时前
堆和二叉树--数据结构初阶(3)(C/C++)
c语言·数据结构·c++·算法·leetcode·深度优先·宽度优先
●VON2 小时前
杭电oj(1087、1203、1003)题解
算法·leetcode·职场和发展