第 240 场周赛 5753. 有向图中最大颜色值

本文介绍了一种结合拓扑排序与动态规划解决有向图中路径价值最大化的算法。通过维护每个节点可达字符的最大出现次数,最终得出全局最大值。特别适用于含有26个小写字母标记的图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然赛中做出来了,也是一眼拓扑排序,但是转移方程部分一开始想歪了,所以简单记录一下。
(要是第一次没想歪,就上大分了)

思路

看到有向图,加上还需要判环,所以肯定想拓扑排序
1.拓扑排序判环的话,我们只需要把入度为0的点加入队列中,不断的跑图即可,如果每个点都被到达了,说明不存在环。

2.那么对于要计算的答案的话,因为小写字母只有26个,所以我们维护一下每个字符在该点能出现的最大次数即可。
对于从点x到点y,即更新点y时候每个字符出现的最多次数

dp[y][i]=max(dp[y][i],dp[x][i]+(colors[y]-‘a’==i))

dp[i][j]表示到达点i时,字符j出现的最多的次数

代码

int du[1<<20],dp[1<<20][26];
class Solution {
public:
    vector<int> e[1<<20];
    int largestPathValue(string colors, vector<vector<int>>& edges) {
        int n=colors.size();
        for(int i=0;i<n;i++){
            du[i]=0;
            for(int j=0;j<26;j++){
                dp[i][j]=0;
            }
        }
        for(auto &x:edges){
            du[x[1]]++;
            e[x[0]].push_back(x[1]);

        }
        queue<int> que;
        for(int i=0;i<n;i++){
            if(!du[i]){
                dp[i][colors[i]-'a']=1;
                que.push(i);
            }
        }
        int ans=1,cnt=0;
        while(!que.empty()){
            int x=que.front();
            ++cnt;
            que.pop();
            for(auto &y:e[x]){
                //从x向y转移,保留字符j出现次数最多的那个
                for(int j=0;j<26;j++){
                    dp[y][j] =max(dp[y][j],dp[x][j]+(colors[y]-'a'==j));
                    ans=max(ans,dp[y][j]);
                }
                if(--du[y]==0){
                    que.push(y);
                }
            }
        }
       if(cnt!=n) return -1;
       return ans;
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不会c语言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值