
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(","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 }
转载于:.html
本文发布于:2024-02-05 04:58:46,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170724674863247.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
| 留言与评论(共有 0 条评论) |