第四十六天 | 279.完全平方数 139.单词拆分

2024-05-29 02:20

本文主要是介绍第四十六天 | 279.完全平方数 139.单词拆分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:279.完全平方数

本题比较简单,几天没做背包但是这道题很快ac了

尝试解答:

        题目类型:给定一个背包容量,求装满背包的最少物品数,且每个物品可以放多次,完全背包

        1.dp[j]数组含义:装满容量为 j 的背包所需要的物品数为dp[j] 

        2.状态转移方程:dp[j] = min(dp[j], dp[j - i * i] + 1)

        3.初始化:dp[0] =  0(这个是通过测试集试出来的),0之外的位置初始化为最大值,防止将答案覆盖

        4.遍历顺序:必须先遍历背包,在物品的终止条件中会用到背包容量作为限制。如果先遍历物品,那不知道for在哪里终止。
        5.打印dp

class Solution {
public:int numSquares(int n) {vector<int> dp(n + 1, INT_MAX);      //0之外的位置初始化为最大值,防止将答案覆盖dp[0] = 0;for(int j = 0; j <= n; j++){     //先背包后物品for(int i = 1; i <= n && i * i <= j; i++){     //for循环的判断条件里要多一条平方数小于背包容量,防止访问越界dp[j] = min(dp[j], dp[j - i * i] + 1);    //统计方法数}}return dp[n];}
};

其实先遍历物品后遍历背包也可以,只不过要加上一个防止访问越界的判断条件if

题目:139.单词拆分

尝试:失败

这道题相当于是判断给定容量的背包能不能装满。背包总容量s.size()

这个背包的总容量为s.size(),如果到最后背包内所装物品的数量为s.size(),就返回true,否则返回false.

1.dp[j]含义:容量为j的背包所装物品的数目

2.动态转移方程:如果字典里有[i],dp[j] = dp[j - ] + 1;

3.初始化:dp[0] = 

4.遍历顺序:先后顺序没有影响,背包的顺序从小到大

正解:

本题应该是求排列数类型

1.dp数组含义:字符串的长度为 i,能否能装满

2.递推公式:截取[i , j]这一段的s,判断这个子串是否存在于字典中,先将数组字典转化为set,set中查询的函数为find()。if([i,j] && dp[i] == true) 则 dp[j] == true; else dp[j] == false

3.初始化:dp[0] = true,非零下标都为false

4.遍历顺序:求排列数,先遍历背包再物品

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() + 1, false);dp[0] = true;for(int j = 0; j <= s.size(); j++){      //先背包for(int i = 0; i <= j; i++){string word = s.substr(i, j - i);     //将s进行剪切赋值给str//substr(起始位置,截取的个数)if(wordSet.find(word) != wordSet.end() && dp[i] == true){dp[j] = true;}}}return dp[s.size()];}
};

[易错]:if的判断条件里应该是dp[i] == true,因为要判断的是i之前的字符串是否查询成功了,不要惯性思维写dp[j - i] == true。

[注意]:各种语法:比如转字典、字典查询、切割字符串等

这篇关于第四十六天 | 279.完全平方数 139.单词拆分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012368

相关文章

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

每日一练7:简写单词(含链接)

1.链接 简写单词_牛客题霸_牛客网 2.题目 3.代码1(错误经验) #include <iostream>#include <string>using namespace std;int main() {string s;string ret;int count = 0;while(cin >> s)for(auto a : s){if(count == 0){if( a <=

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

uva674(完全背包)

题意: 有5种硬币1,5,10,25,50,;现在随意的给出一个价钱,问你有几种组合方式! 输入11 输出4 1+...+1(10个),5+(6*1),5+5+1,  10+1(共4种) 思路; 满足完全背包思想,状态转移方程:dp[i+num[k]] += dp[i](dp[i]为组合成i的不重复种数,num[k]分别为1,5,10,25,50)不能合在一起转移,否则会导致重复!

隐私计算实训营:SplitRec:当拆分学习遇上推荐系统

拆分学习的概念 拆分学习的核心思想是拆分网络结构。每一个参与方拥有模型结构的一部分,所有参与方的模型合在一起形成一个完整的模型。训练过程中,不同参与方只对本地模型进行正向或者反向传播计算,并将计算结果传递给下一个参与方。多个参与方通过联合模型进行训练直至最终收敛。 一个典型的拆分学习例子: Alice持有数据和基础模型。Bob只有数据、基础模型和fuse模型。 Alice使用自己的数据

222.完全二叉树的节点个数

(写给未来遗忘的自己) 题目: 代码: class Solution {public:int countNodes(TreeNode* root) {queue<TreeNode*>node_que;if(root==nullptr) return 0;node_que.push(root);int result;while(!node_que.empty()){int layer_s

动态规划---单词拆分

题目: 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 思路:本题属于完全背包问题,字符串s的长度为背包容量,字符串列表wordDict中的每一个元素相当于物品。 动态规划五部曲: 1.确定dp数组及含义 dp数组为元素类型是布

WPS如何查看已添加到词典的单词

WPS Office(12.1.0.17827) ① 点击文件,在文件中找到选项 ② 找到拼写检查并点击自定义词典 ③ 如果要删除已添加到词典的"错词",则点击修改 ④ 选择"错词", 点击删除

不完全微分PID控制算法

不完全微分PID控制算法 注:本文内容摘自《先进PID控制MATLAB仿真(第4版)》刘金琨 编著,研读此书受益匪浅,感谢作者! 在PID控制中,微分信号的引入可改善系统的动态特性,但也容易引起高频干扰,在误差扰动突变时尤其显出微分项的不足。若在控制算法中加入低通滤波器,则可以使系统性能得到改善。 克服上述缺点的方法之一是在PID算法中加入一个一阶惯性环节(低通滤波器) G f