TheZealous的集训日常之奇奇怪怪的dp题(1) 洛谷P5322 [BJOI2019]排兵布阵

排兵布阵!

【思路】

1.审题:我方派出的兵一定要比敌方所出兵的二倍要多;要使用一个策略攻打多个对手。

2.分析:既然要使用一个策略攻打多个对手,那么对于每个城堡而言,每个对手派出的兵力不同,只要我打败了派出兵力多的,我就一定可以打败派出兵力少的。则可把该游戏转化为分组背包,每个城堡中的不同对手为组内元素,dp即可。

【代码实现】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,m,s;
 4 int a[1005][1005];
 5 int dp[20005];
 6 
 7 int main()
 8 {
 9     scanf("%d %d %d",&s,&n,&m);
10     for(int i=1;i<=s;i++)
11     {
12         for(int j=1;j<=n;j++)
13         {
14             scanf("%d",&a[j][i]);
15         }
16     } 
17     for(int i=1;i<=n;++i)
18     {
19         sort(a[i]+1,a[i]+1+s);    
20         for(int j=1;j<=s;j++)
21         {
22             a[i][j]=a[i][j]*2+1;;
23         }
24     }
25     for(int i=1;i<=n;i++)
26     {
27         for(int j=m;j>0;j--)
28         {
29             for(int k=1;k<=s;k++)
30             {
31                 if(j-a[i][k]>=0&&dp[j-a[i][k]]+i*k>dp[j]) dp[j]= dp[j-a[i][k]]+i*k;
32             }
33         }
34     }
35     printf("%d",dp[m]);
36     return 0;
37 }

 

 下午可太困了!

 

上一篇:! BJOI2019奥术神杖


下一篇:[BJOI2019]光线——递推