鱼C论坛

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

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

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

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

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

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

int v[9] = {-1, 5, 1, 8, 4, 6, 3, 2, 4};
int ni[9] = {-1, 0, 0, 0, 1, 0, 2, 3, 5};
int opt(int);
int opt(int n){
        int max;
        if(n == 1 || n == 2){
                return 5;
        }
        else{
                if(v[n] + opt(ni[n]) > opt(n-1)){
                        max += v[n] + opt(ni[n]);
                }
                else{
                        max += opt(n-1);
                }
        }
        return max;
}
int main(){
        int a = opt(8);
        printf("%d", a);
        return 0;
}
它又不输出了 , 不知道怎么回事
求指教
最佳答案
2022-3-20 21:45:16
本帖最后由 傻眼貓咪 于 2022-3-20 21:47 编辑
柿子饼同学 发表于 2022-3-20 21:39
欸话说这是不是就是python里面 for i  in A: i*= i 的意思呀
for(int x: A) x *= x;
就好象 Python 里的
for i in A: i *= i 一样,
只是拷贝值,不会影响原本的值


for(int &x: A) x *= x;
就好象
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 吗?
#include <iostream>
#include <vector>

// 开始时间、结束时间
typedef struct {
        unsigned start, end;
}Time;

// 工作时间、收入
typedef struct {
        Time time;
        unsigned income;
}Timer;

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

int main() {
        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 } };
        std::vector<Timer> V;
        for (int i = 0; i < 8; i++) V.push_back({ { arr[i][0], arr[i][1] }, arr[i][2] });
        unsigned max = 0;
        for (const Timer &t: V) {
                if (income(V, t.time, t.income) > max) {
                        max = income(V, t.time, t.income);
                }
        }
        std::cout << max;
        return 0;
}
13
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

求问
for (const Timer &t : V) {
这句什么意思,是不是给Timer 起个名字叫 t 还有这句
for (int u : temp) if (u > max) max = u;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 22:49:46 | 显示全部楼层
int income(vector<Timer> V, Time T, int sum = 0){
        vector<int> temp; // ???
        int max = 0; //最大值 
        for(const Timer &t : V){ // ???
                if(t.time.start >= T.end){ //为什么t.time.start换成T.start就不对了 
                        temp.push_back(income(V, t.time, t.income));
                }
        }
        for(int u : temp) if (u > max) max = u;
        return sum + max;
} 
这个函数它是怎么实现功能的能详细讲讲嘛 , 谢谢
想知道小甲鱼最近在做啥?请访问 -> 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 还有这句

#include <iostream>
#include <vector>

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

    for(int x: C) std::cout << x << " ";
    std::cout << std::endl;
    
    return 0;
}
1 2 3 4 5 
1 4 9 16 25 
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,如我的代码:

// 开始时间、结束时间
typedef struct {
        unsigned start, end;
}Time;

// 工作时间、收入
typedef struct {
        Time time; // <---------------注意这里
        unsigned income;
}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 | 显示全部楼层

那这些跟
for(int i = 0; i < 5; i++){
        A[i] *= A[i];
}
有啥区别呢
想知道小甲鱼最近在做啥?请访问 -> 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 的意思呀
for(int x: A) x *= x;
就好象 Python 里的
for i in A: i *= i 一样,
只是拷贝值,不会影响原本的值


for(int &x: A) x *= x;
就好象
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-11-18 04:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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