码迷,mamicode.com
首页 > 其他好文 > 详细

A - Free DIY Tour HDU - 1224

时间:2020-03-18 18:27:29      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:print   sizeof   状态转移方程   ace   code   rcu   最好   clu   amp   

题目大意:每一个城市都有一定的魅力值,然后有一个有向图,根据这个有向图从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#\n",t);
    printf("points : ");
    cout<<dp[n+1]<<endl;
    printf("circuit : ");
    print(pre[n+1]);
    printf("->1\n");
    if(t!=t1) cout<<endl;
    
}                         
int main(){
    
    cin>>t1;
    for(int i=1;i<=t1;i++) solve(i);
    return 0;
} 

 

A - Free DIY Tour HDU - 1224

标签:print   sizeof   状态转移方程   ace   code   rcu   最好   clu   amp   

原文地址:https://www.cnblogs.com/Accepting/p/12519069.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!