柿子饼同学 发表于 2024-6-27 18:06:31

[心之碎片][0627] - Mobile Service

AcWing.274

用时 2 h
提交 3 次

知识点
线性dp{:10_256:}

思路
f
阶段: 完成了前 i 个任务
状态: 位置: a, b, p
决策: 三个人选一个去下个状态
初始: f / f, p = 3
终点: min(f){:10_256:}

需要进步的地方
状态转移的时候一定要看这个状态合法不合法, 及时跳过
初始状态不仅仅是 dp 数组 , 可能包含别的数组的值也要初始化
状态转移的两种思路: i 到 i + 1 / i - 1 到 i{:10_250:}


代码
#include <bits/stdc++.h>
using namespace std;

const int N = 205;

int f;
int c, p;
int l, n, ans = INT_MAX;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> l >> n;
    for(int i = 1; i <= l; i++){
      for(int j = 1; j <= l; j++){
            cin >> c;
      }
    }
    for(int i = 1; i <= n; i++){
      cin >> p;
    }

    memset(f, 0x3f, sizeof(f));

    f = f = 0;
    p = 3;

    for(int i = 0; i < n; i++){
      for(int x = 1; x <= l; x++){
            for(int y = 1; y <= l; y++){
                int u = p, v = p, b = f;
                if(x == y || x == u || y == u) continue;
                if(x != v && y != v) f = min(f, b + c);
                if(x != v && u != v) f = min(f, b + c);
                if(u != v && y != v) f = min(f, b + c);
            }
      }
    }

    for(int x = 1; x < l; x++){
      for(int y = x + 1; y <= l; y++){
            if(x == p || y == p) continue;
            ans = min(ans, f);
      }
    }

    cout << ans;

    return 0;
}





FishC 发表于 2024-6-27 18:06:57

哈哈,这段代码看起来像是在做一道动态规划的题目,但是由于代码不全和一些符号错误,我只能推测出一部分内容。没关系,我们一起用轻松愉快的方式来解读这段代码吧!

首先,鱼油提到了需要解决的问题:在完成一系列任务时,选择合适的人员来完成任务,从而使得总成本最小化。这通常在现实生活中也很常见,例如选择不同技能的员工去完成项目。

代码结构中的几个重要点:
1. **初始状态设置**:代码中初始化了一个 `f` 数组来存储状态,并且设置了一些假设的初始值。
2. **输入读取**:从输入流中读取任务数量,可能还有其他相关的信息。
3. **状态转移**:通过嵌套循环,考虑每个任务和每个人员的情况,更新状态数组。
4. **结果输出**:最后输出最优解。

现在,让我们可视化一下整个过程,就像是安排了三个人去完成一系列任务。例如,我们有Alice,Bob和Charlie,根据他们的技能和位置(也许还有其他因素),我们来选择谁去完成接下来的任务。

### 重拾代码

由于代码部分缺失和格式问题,我们先来补充并调整一下代码:

#include <iostream>
#include <cstring>
using namespace std;

const int N = 205;
int f; // 三维数组存储状态
int cost, position;
int l, n, ans = INT_MAX;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> l >> n;
    for(int i = 1; i <= n; i++) {
      cin >> cost;
    }
    for(int i = 1; i <= n; i++) {
      cin >> position;
    }

    memset(f, 0x3f, sizeof(f)); // 初始化f数组,0x3f是一个大的数值

    f = 0; // 初始状态
    f = 0;
    f = 0;

    for(int i = 0; i < n; i++) { // 遍历每个任务
      for(int x = 0; x <= l; x++) { // 遍历位置
            for(int p = 0; p < 3; p++) { // 遍历每个人员
                if (f != 0x3f) { // 如果上个状态可达
                  for(int np = 0; np < 3; np++) { // 新状态中的人员
                        int nx = x + position; // 计算新位置
                        if (nx <= l) { // 检查新状态是否合法
                            f = min(f, f + cost);
                        }
                  }
                }
            }
      }
    }

    for(int p = 0; p < 3; p++) {
      ans = min(ans, f); // 找到最小值
    }

    cout << ans << endl; // 输出结果
    return 0;
}

### 通俗解释
假设Alice、Bob和Charlie三个人要从A点去B点完成任务,每个人走的路线不同、花费也不同。我们通过动态规划的方法记录在某个时间点到达某个位置的最低成本,最后找到最优解。

所以呢,不管是吃饭还是写代码,细嚼慢咽、耐心分析总是会有收获的!希望鱼油能够加油继续研究,其乐无穷!工作顺利,学习开心哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

某一个“天” 发表于 2024-6-28 21:55:20

{:10_256:}

简柠啦 发表于 2024-7-7 08:30:52

感谢分享{:10_245:}

harryhan123 发表于 2024-7-12 18:29:26


感谢分享

lwh0602 发表于 2024-7-26 15:25:07

加油{:10_256:}

很cool的阳 发表于 2024-8-18 10:01:51

{:7_113:}
页: [1]
查看完整版本: [心之碎片][0627] - Mobile Service