鱼C论坛

 找回密码
 立即注册
查看: 999|回复: 15

[已解决]动态规划求最大值

[复制链接]
发表于 2022-3-18 22:47:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
图片在下 , 就是灰色占据的是时间 , 红色代表这段时间能赚到的钱 , 一段时间只能做一件事
假设一件事做完中间可以不停顿接着做另一件事 , 问能赚到的钱最大值是多少
我的代码:
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. int v[9] = {-1, 5, 1, 8, 4, 6, 3, 2, 4};
  4. int ni[9] = {-1, 0, 0, 0, 1, 0, 2, 3, 5};
  5. int opt(int);
  6. int opt(int n){
  7.         int max;
  8.         if(n == 1 || n == 2){
  9.                 return 5;
  10.         }
  11.         else{
  12.                 if(v[n] + opt(ni[n]) > opt(n-1)){
  13.                         max += v[n] + opt(ni[n]);
  14.                 }
  15.                 else{
  16.                         max += opt(n-1);
  17.                 }
  18.         }
  19.         return max;
  20. }
  21. int main(){
  22.         int a = opt(8);
  23.         printf("%d", a);
  24.         return 0;
  25. }
复制代码

它又不输出了 , 不知道怎么回事
求指教
最佳答案
2022-3-20 21:45:16
本帖最后由 傻眼貓咪 于 2022-3-20 21:47 编辑
柿子饼同学 发表于 2022-3-20 21:39
欸话说这是不是就是python里面 for i  in A: i*= i 的意思呀
  1. for(int x: A) x *= x;
复制代码
就好象 Python 里的
  1. for i in A: i *= i 一样,
复制代码
只是拷贝值,不会影响原本的值



  1. for(int &x: A) x *= x;
复制代码
就好象
  1. for(int i = 0; i < 5; i++) A[i] *= A[i];
复制代码
一样,引用,并且会影响原本的值
屏幕截图 2022-03-18 224408.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 23:32:55 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-3-19 08:09 编辑

答案是 13 吗?
  1. #include <iostream>
  2. #include <vector>

  3. // 开始时间、结束时间
  4. typedef struct {
  5.         unsigned start, end;
  6. }Time;

  7. // 工作时间、收入
  8. typedef struct {
  9.         Time time;
  10.         unsigned income;
  11. }Timer;

  12. // 计算收入
  13. unsigned income(std::vector<Timer> V, Time T, unsigned sum = 0) {
  14.         std::vector<unsigned> temp;
  15.         unsigned max = 0;
  16.         for (const Timer &t : V) {
  17.                 // 寻找下一个吻合的时间点路线
  18.                 if (t.time.start >= T.end) {
  19.                         temp.push_back(income(V, t.time, t.income));
  20.                 }
  21.         }
  22.         for (unsigned u : temp) if (u > max) max = u;
  23.         return sum + max;
  24. }

  25. int main() {
  26.         unsigned arr[][3] = { { 1, 4, 5 }, { 3, 5, 1 }, { 0, 6, 8 }, { 4, 7, 4 }, { 3, 8, 6 }, { 5, 9, 3 }, { 6, 10, 2 }, { 8, 11, 4 } };
  27.         std::vector<Timer> V;
  28.         for (int i = 0; i < 8; i++) V.push_back({ { arr[i][0], arr[i][1] }, arr[i][2] });
  29.         unsigned max = 0;
  30.         for (const Timer &t: V) {
  31.                 if (income(V, t.time, t.income) > max) {
  32.                         max = income(V, t.time, t.income);
  33.                 }
  34.         }
  35.         std::cout << max;
  36.         return 0;
  37. }
复制代码
  1. 13
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 22:39:22 | 显示全部楼层

求问
  1. for (const Timer &t : V) {
复制代码

这句什么意思,是不是给Timer 起个名字叫 t 还有这句
  1. for (int u : temp) if (u > max) max = u;
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 22:49:46 | 显示全部楼层
  1. int income(vector<Timer> V, Time T, int sum = 0){
  2.         vector<int> temp; // ???
  3.         int max = 0; //最大值
  4.         for(const Timer &t : V){ // ???
  5.                 if(t.time.start >= T.end){ //为什么t.time.start换成T.start就不对了
  6.                         temp.push_back(income(V, t.time, t.income));
  7.                 }
  8.         }
  9.         for(int u : temp) if (u > max) max = u;
  10.         return sum + max;
  11. }
复制代码

这个函数它是怎么实现功能的能详细讲讲嘛 , 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 22:50:42 | 显示全部楼层

答案对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 23:01:28 | 显示全部楼层
柿子饼同学 发表于 2022-3-19 22:39
求问
这句什么意思,是不是给Timer 起个名字叫 t 还有这句

for (const Timer &t : V) {} 这段代码是为了避免深拷贝,而引用原值,const 为了不让改变其值。当然你也可以直接 for(Timer t: V) 也行。

例子:
for (auto x: V) 如果只是要读取向量数组中的元素值,将循环变量定义为拷贝类型
for (auto &x: V) 如果要更改向量数组中的元素值,必须将循环变量定义为引用类型
for (const auto x: V) 不想更改值,只想引用,不想拷贝(避免深拷贝)

for (int u : temp) if (u > max) max = u; 这段代码是递归后结果,储存进 temp 里(意思就是分叉路线的最后结果,找出最大值),考虑到路线可能不止一条。

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
柿子饼同学 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 23:09:59 | 显示全部楼层
柿子饼同学 发表于 2022-3-19 22:39
求问
这句什么意思,是不是给Timer 起个名字叫 t 还有这句

  1. #include <iostream>
  2. #include <vector>

  3. int main()
  4. {
  5.     std::vector<int> A = {1, 2, 3, 4, 5};
  6.     std::vector<int> B = {1, 2, 3, 4, 5};
  7.     std::vector<int> C = {1, 2, 3, 4, 5};
  8.    
  9.     for(int x: A) x *= x; // <-------- 注意这里
  10.     for(int &x: B) x *= x; // <-------- 注意这里
  11.     // for(const int &x: C) x *= x;  // <-------- 注意这里,如果这样写,会报错:error: assignment of read-only reference ‘x’,只能读,不能改写
  12.    
  13.     /*-------- 打印 --------*/
  14.     for(int x: A) std::cout << x << " ";
  15.     std::cout << std::endl;
  16.    
  17.     for(int x: B) std::cout << x << " ";
  18.     std::cout << std::endl;

  19.     for(int x: C) std::cout << x << " ";
  20.     std::cout << std::endl;
  21.    
  22.     return 0;
  23. }
复制代码
  1. 1 2 3 4 5
  2. 1 4 9 16 25
  3. 1 2 3 4 5
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
柿子饼同学 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 23:15:24 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-3-19 23:17 编辑
柿子饼同学 发表于 2022-3-19 22:49
这个函数它是怎么实现功能的能详细讲讲嘛 , 谢谢


哈哈哈,抱歉了兄弟,因为我为了包装好看,所以写了 2 个结构体,一个是 Time,另一个是 Timer,至於 Timer 里的属性有 Time time,如我的代码:

  1. // 开始时间、结束时间
  2. typedef struct {
  3.         unsigned start, end;
  4. }Time;

  5. // 工作时间、收入
  6. typedef struct {
  7.         Time time; // <---------------注意这里
  8.         unsigned income;
  9. }Timer;
复制代码


而 t 是 Timer 结构体,其属性 t.time 又有属性 start 和 end

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-20 20:57:35 | 显示全部楼层
傻眼貓咪 发表于 2022-3-19 23:15
哈哈哈,抱歉了兄弟,因为我为了包装好看,所以写了 2 个结构体,一个是 Time,另一个是 Timer,至於 T ...

结构体这种写法我知道 , 但是不懂函数怎么具体执行下来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-20 21:26:56 | 显示全部楼层
柿子饼同学 发表于 2022-3-20 20:57
结构体这种写法我知道 , 但是不懂函数怎么具体执行下来的

慢慢来吧,大家一起学习学习吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-20 21:28:46 | 显示全部楼层

那这些跟
  1. for(int i = 0; i < 5; i++){
  2.         A[i] *= A[i];
  3. }
复制代码

有啥区别呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-20 21:39:20 | 显示全部楼层

欸话说这是不是就是python里面 for i  in A: i*= i 的意思呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-20 21:45:16 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2022-3-20 21:47 编辑
柿子饼同学 发表于 2022-3-20 21:39
欸话说这是不是就是python里面 for i  in A: i*= i 的意思呀
  1. for(int x: A) x *= x;
复制代码
就好象 Python 里的
  1. for i in A: i *= i 一样,
复制代码
只是拷贝值,不会影响原本的值



  1. for(int &x: A) x *= x;
复制代码
就好象
  1. for(int i = 0; i < 5; i++) A[i] *= A[i];
复制代码
一样,引用,并且会影响原本的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-20 22:08:57 | 显示全部楼层
傻眼貓咪 发表于 2022-3-20 21:45
就好象 Python 里的 只是拷贝值,不会影响原本的值



就好象  一样,引用,并且会影响原本的值

哇 , 还能这么写 , 长知识了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-20 22:12:47 | 显示全部楼层
柿子饼同学 发表于 2022-3-20 22:08
哇 , 还能这么写 , 长知识了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-20 22:15:54 | 显示全部楼层
柿子饼同学 发表于 2022-3-20 22:08
哇 , 还能这么写 , 长知识了

如果你想了解更多关于这点,可以往 C++ 的左值引用 & 和右值引用 && 研究研究。当然这里是非常深入的知识。我平常只会用皮毛而已,哈哈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 17:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表