标签: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; }
标签:print sizeof 状态转移方程 ace code rcu 最好 clu amp
原文地址:https://www.cnblogs.com/Accepting/p/12519069.html