当前位置: 首页 > news >正文

彩色路径 第32次CCF-CSP计算机软件能力认证

看见图就想用图去做

但是发现答案用的dp数组做:
20分:简单dp

因为只需要考虑是否超过节点个数l

1.我们定义dp[i][j]为 到达第i个节点经过j条边的最大长度

2.dp[v][j]=max(dp[v][j],dp[u][j-1]+w)

3.初始化 求最长肯定要初始化为INT_MIN

4.遍历顺序:先遍历每个结点u  再遍历对应的v

对每个v去进行1-l条边的遍历 得到经过j条的最大长度

50分:状态压缩dp

100分:看不懂

超时20分代码:

#include<bits/stdc++.h>
using namespace std;
int N, M, L, K;
struct Edge {
    int to, length;
    Edge(int to, int length) :to(to), length(length) {}
};
vector<int> color;//颜色标签
vector<vector<Edge>> graph;//邻接表
//vector<int> path;
int max_length = 0;//最大长度
//i:当前遍历节点
//colors:目前找到的颜色集合
//num:结点个数
void dfs(int i,set<int> colors,int num,int now_length) {
    if (num > L) {
        return;
    }
    else {
        //说明找到了
        if (i == N - 1) {
            /*
            for (int i = 0; i < path.size(); i++)
                cout << path[i] << " ";
            cout << endl;
            */
            max_length = max(max_length, now_length);
            return;
        }
        //没找到继续遍历
        else {
            for (Edge e : graph[i]) {
                int to = e.to;
                int length = e.length;
                int col = color[to];
                //说明当前颜色不存在
                if (colors.find(col) == colors.end()) {
                    //path.push_back(to);
                    colors.insert(col);
                    dfs(to, colors, num + 1, now_length + length);
                    colors.erase(col);
                    //path.pop_back();
                }
            }
        }
    }

}
//找到最长观光路线:
//颜色各不相同 结点数小于等于L
//越长越好
void solve() {
    set<int> c;
    c.insert(color[0]);
    dfs(0, c, 1, 0);
    cout << max_length;
}
int main() {
    //N:结点个数(0~N-1)
    //M:边的个数
    //L:理想观光路线节点上限
    //K:颜色种类(0~K-1)
    cin >> N >> M >> L >> K;
    cin.ignore();
    color.resize(N);
    for (int i = 0; i < N; i++) {
        cin>>color[i];
    }
    //重置图的大小
    graph.resize(N);
    vector<int> U(M), V(M), D(M);
    for (int i = 0; i < M; i++) {
        cin>>U[i];
    }
    for (int i = 0; i < M; i++) {
        cin >> V[i];
    }
    for (int i = 0; i < M; i++) {
        cin >> D[i];
    }
    //构建图
    for (int i = 0; i < M; i++) {
        Edge e = Edge(V[i], D[i]);
        graph[U[i]].push_back(e);
    }
    solve();
    return 0;
}

20分dp核心代码:

    // 初始化动态规划数组
    vector<vector<int>> dis(n, vector<int>(l, -inf));
    dis[0][0] = 0;  // 起点的初始状态

    // 动态规划计算最大路径权重
    for (int u = 0; u < n - 1; u++) {
        for (auto tem : g[u]) {
            int v = tem.first, w = tem.second;
            for (int i = 1; i < l; i++) {
                if (dis[u][i - 1] == -inf) continue;  // 如果路径不可达,跳过
                dis[v][i] = max(dis[v][i], dis[u][i - 1] + w);
            }
        }
    }

http://www.dtcms.com/a/122864.html

相关文章:

  • 服务器运维ACL访问控制列表如何配置
  • 【Leetcode-Hot100】字母异位词分组
  • echarts图表相关
  • 【智能体开发】智能体前后端开发方案
  • 信奥赛之c++课后练习题及解析(算数运算符)
  • Java学习总结-线程池
  • 【NLP 56、实践 ⑬ LoRA完成NER任务】
  • 【golang】堆和栈的区别
  • MySQL主从复制技术详解:原理、实现与最佳实践
  • Docker与Kubernetes在ZKmall开源商城容器化部署中的应用
  • Linux内核页表缓存(TLB)与巨型页
  • 使用Alamofire下载网站首页内容
  • PDFBox/Itext5渲染生成pdf文档
  • Php laravel 留言板 curd 实战
  • 2025数据库系统工程师上午考试知识点汇总
  • 【C++游戏引擎开发】第10篇:AABB/OBB碰撞检测
  • error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408
  • 【大模型理论篇】关于生成式模型中联合分布概率学习必要性以及GPT是生成式模型的讨论
  • 【ida】ida笔记
  • C语言指针和函数
  • CSS 笔记——Flexbox(弹性盒布局)
  • react-router children路由报错
  • 配置SSMS 让数据库中会话时长大于30秒的自动终止
  • python爬虫发送请求的方法汇总
  • LeetCode 33 搜索旋转排序数组
  • Tailwind CSS的五节课教学计划
  • 动态科技感html导航网站源码
  • MySQL:事务
  • VectorBT量化入门系列:第四章 高级策略开发与优化
  • Rust Command无法执行*拓展解决办法