标签:else ons include 关系 trick 最大 inpu cout 不同
2
3 5
83 86 77
15 93 35
86 92 49
3 3 3 1 2
5 10
36 11 68 67 29
82 30 62 23 67
35 29 2 22 58
69 67 93 56 11
42 29 73 21 19
0 0 5 0 4 0 0 0 4 0
270
625
一个思路比较明确的DP
DP [ i ] [ j ]
代表第i个动作是j时现在的最大应援值
那么现在可以把所有情况分成4种:
1.前一个动作已知:
(1)现在动作已知:值为固定值,无法选择
(2)现在动作未知:把所有可能的动作扫一遍 有转移方程:dp[i][j]=dp[i-1][cmd[i-1]]+mp[cmd[i-1]][j]
2.前一个动作未知
(1)现在动作已知:把前一个可能的动作扫一遍
(2)现在动作未知,把所有可能的对应关系全部扫一遍
应援值有可能为负,最后答案也应该为负值。所以要初始化为-INF
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=110; 4 const int INF=1e6+7; 5 int mp[maxn][maxn]; 6 int cmd[maxn]; 7 int dp[maxn][maxn]; 8 int main() 9 { 10 ios::sync_with_stdio(false); 11 //freopen("in.txt","r",stdin); 12 int t,n,m,ans=0,dx; 13 cin>>t; 14 while(t--) 15 { 16 ans=-INF; 17 cin>>n>>m; 18 memset(mp,-INF,sizeof(mp)); 19 memset(dp,0,sizeof(dp)); 20 for(int i=1;i<=n;++i) 21 for(int j=1;j<=n;++j) 22 cin>>mp[i][j]; 23 for(int i=1;i<=m;++i) 24 cin>>cmd[i]; 25 for(int i=2;i<=m;++i){ 26 if(cmd[i-1]){ 27 if(cmd[i]) 28 dp[i][cmd[i]]=dp[i-1][cmd[i-1]]+mp[cmd[i-1]][cmd[i]]; 29 else{ 30 for(int j=1;j<=n;++j) 31 dp[i][j]=dp[i-1][cmd[i-1]]+mp[cmd[i-1]][j]; 32 } 33 }else{ 34 if(cmd[i]){ 35 dx=-INF; 36 for(int j=1;j<=n;++j) 37 dx=max(dx,dp[i-1][j]+mp[j][cmd[i]]); 38 dp[i][cmd[i]]+=dx; 39 } 40 else 41 for(int j=1;j<=n;++j){ 42 dx=-INF; 43 for(int k=1;k<=n;++k) 44 dx=max(dx,dp[i-1][k]+mp[k][j]); 45 dp[i][j]+=dx; 46 } 47 } 48 } 49 if(cmd[m]) 50 ans=dp[m][cmd[m]]; 51 else 52 for(int i=1;i<=n;++i) 53 ans=max(dp[m][i],ans); 54 cout<<ans<<endl; 55 } 56 return 0; 57 }
标签:else ons include 关系 trick 最大 inpu cout 不同
原文地址:http://www.cnblogs.com/SCaryon/p/7421037.html