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,排兵,派出,洛谷,int,对手,1005,dp 来源: https://www.cnblogs.com/TheZealous/p/15094162.html