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

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

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。

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

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

5

apple

//然后j = 8的时候,即长度3时,出现第三个dp8 = 1,s8 = 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

想说的就是,正好dpx中的x,是下一个起始位,所以没有那么多的±1来对齐的问题。最后直接看dps.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;
}
相关推荐
octopus_c7 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法
YH552698412 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
吃着火锅x唱着歌13 小时前
Effective C++ 学习笔记 条款43 学习处理模板化基类内的名称
c++·笔记·学习
felixking13 小时前
C++20 协程
开发语言·c++·协程
遥感知识服务14 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶14 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆14 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
小小龙学IT16 小时前
FlatBuffers 深度解析:Google 开源零拷贝序列化库完全指南
c++·开源
叩码以求索16 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
wuminyu17 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++