鱼C论坛

 找回密码
 立即注册
查看: 246|回复: 6

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

[复制链接]
回帖奖励 5 鱼币 回复本帖可获得 1 鱼币奖励! 每人限 1 次
发表于 2024-6-27 18:06:31 | 显示全部楼层 |阅读模式

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

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

x
AcWing.274

用时 2 h
提交 3 次

知识点
线性dp

思路
f[i][a][b]
阶段: 完成了前 i 个任务
状态: 位置: a, b, p[i]
决策: 三个人选一个去下个状态
初始: f[0][1][2] / f[0][2][1], p[0] = 3
终点: min(f[n][x][y])

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


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

const int N = 205;

int f[N*5][N][N];
int c[N][N], p[N*5];
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[i][j];
        }
    }
    for(int i = 1; i <= n; i++){
        cin >> p[i];
    }

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

    f[0][1][2] = f[0][2][1] = 0;
    p[0] = 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[i], v = p[i + 1], b = f[i][x][y];
                if(x == y || x == u || y == u) continue;
                if(x != v && y != v) f[i + 1][x][y] = min(f[i + 1][x][y], b + c[u][v]);
                if(x != v && u != v) f[i + 1][x][u] = min(f[i + 1][x][u], b + c[y][v]);
                if(u != v && y != v) f[i + 1][u][y] = min(f[i + 1][u][y], b + c[x][v]);
            }
        }
    }

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

    cout << ans;

    return 0;
}





本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 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[N][N][3]; // 三维数组存储状态
int cost[N], position[N];
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[i];
    }
    for(int i = 1; i <= n; i++) {
        cin >> position[i];
    }

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

    f[0][0][0] = 0; // 初始状态
    f[0][0][1] = 0;
    f[0][0][2] = 0;

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-28 21:55:20 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2024-7-7 08:30:52 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2024-7-12 18:29:26 | 显示全部楼层

回帖奖励 +1 鱼币


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

使用道具 举报

发表于 2024-7-26 15:25:07 | 显示全部楼层

回帖奖励 +1 鱼币

加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-18 10:01:51 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-8 07:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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