当前位置:   article > 正文

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

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

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

 139.单词拆分

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

  1. #include <iostream>
  2. #include <unordered_set>
  3. #include <vector>
  4. using namespace ::std;
  5. class Solution
  6. {
  7. public:
  8. bool wordBreak(string s, vector<string> &wordDict)
  9. {
  10. unordered_set<string> WD(wordDict.begin(), wordDict.end());
  11. vector<bool> dp(s.size() + 1, 0);
  12. dp[0] = 1;
  13. for (int j = 1; j < s.size() + 1; j++)
  14. {
  15. for (int i = 0; i < j; i++)
  16. { // 这里的遍历物品还需要思考一下,不太像正常的物品
  17. string str = s.substr(i, j - i);
  18. if (WD.find(str) != WD.end() && dp[i] == true)
  19. {
  20. dp[j] = true;
  21. for (int ii = 0; ii < s.size() + 1; ii++)
  22. {
  23. cout << dp[ii] << ' ';
  24. }
  25. cout << "end" << endl;
  26. cout << j << endl;
  27. cout << str << endl;
  28. }
  29. }
  30. }
  31. // print
  32. return dp[s.size()];
  33. }
  34. };
  35. int main()
  36. {
  37. Solution syz;
  38. string s1 = "applepenapple";
  39. vector<string> wordDict1;
  40. string a1 = "apple";
  41. string a2 = "pen";
  42. wordDict1.push_back(a1);
  43. wordDict1.push_back(a2);
  44. syz.wordBreak(s1, wordDict1);
  45. return 0;
  46. }

这里想试个东西,总感觉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)

  1. #include<iostream>
  2. #include<vector>
  3. using namespace::std;
  4. int main(){
  5. int C;
  6. int N;
  7. cin >> C >> N;
  8. vector<int>w(N,0);
  9. vector<int>v(N,0);
  10. vector<int>k(N,0);
  11. for(int i = 0; i< N ;i++){
  12. cin >> w[i];
  13. }
  14. for(int i = 0; i< N ;i++){
  15. cin >> v[i];
  16. }
  17. for(int i = 0; i< N ;i++){
  18. cin >> k[i];
  19. }
  20. vector<int>dp(C+1,0);
  21. for(int i = 0;i < N;i++){
  22. for(int j = C;j >= w[i];j--){ //这里忘记考虑01背包要从后往前
  23. for(int kk = 1;kk <= k[i];kk++){
  24. //这里忘记考虑 =的情况
  25. if(j >= kk * w[i])dp[j] = max(dp[j],dp[j - kk * w[i]] + kk * v[i]);
  26. }
  27. }
  28. }
  29. cout << dp[C] << endl;
  30. return 0;
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/561187
推荐阅读
相关标签
  

闽ICP备14008679号