zoukankan      html  css  js  c++  java
  • A

    题目大意:每一个城市都有一定的魅力值,然后有一个有向图,根据这个有向图从1到n+1所获得的魅力的最大值,并输出路径(要求只能从编号娇小的城市到编号较大的城市)。

    题解:很容易想到最短路+路径纪录。但是感觉有点小题大做了。我开始的方法是dfs+dp,dp[i]表示i的子节点最大的魅力值,但是它给的是一个图,并不是树,其中有环,所以之一WA.....。

    正解:两个for循环,dp[i]表示从第1个城市到第i个城市的最好状态。然后枚举小于i的所有城市,

    状态转移方程dp[i]=max(dp[i],dp[j]+arr[i])(j<i)。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=200;
    int dp[N];
    int mp[N][N];
    int n;
    int t1;
    int pre[N];
    int arr[N];
    void print(int x){
        if(x==1) {
            cout<<1;
            return ;
        }
        print(pre[x]);
        printf("->%d",x);
    }
    
    void solve(int t){
        memset(dp,0,sizeof dp);
        memset(mp,0,sizeof mp);
        memset(pre,0,sizeof pre);
        memset(arr,0,sizeof arr);
        cin>>n; 
        for(int i=1;i<=n;i++) cin>>arr[i];
        int m;
        cin>>m;
        for(int i=1;i<=m;i++){
            int x,y;
            cin>>x>>y;
            mp[x][y]=1;
        }
        for(int i=1;i<=n+1;i++){
            for(int j=1;j<i;j++){
                if(mp[j][i]&&dp[i]<dp[j]+arr[i]){
                    dp[i]=dp[j]+arr[i];
                    pre[i]=j; 
                }    
            }
        }
        printf("CASE %d#
    ",t);
        printf("points : ");
        cout<<dp[n+1]<<endl;
        printf("circuit : ");
        print(pre[n+1]);
        printf("->1
    ");
        if(t!=t1) cout<<endl;
        
    }                         
    int main(){
        
        cin>>t1;
        for(int i=1;i<=t1;i++) solve(i);
        return 0;
    } 
  • 相关阅读:
    史上最简单的Hibernate入门简单介绍
    极客Web前端开发资源大荟萃
    ios7 UIScrollView 尺寸问题
    用ahk脚本自己主动删除flashcookies
    CSS文字样式
    Windows 10 安装
    万圣节福利:红孩儿3D引擎开发课程《3ds max导出插件初步》
    算法实验 层序列表问题(二叉树)
    git配置别名
    git忽略特殊文件
  • 原文地址:https://www.cnblogs.com/Accepting/p/12519069.html
Copyright © 2011-2022 走看看