【BJOI2019】排兵布阵 DP

题目大意:有$n$座城堡,$s$轮游戏。

对于第$x$轮,第i座城堡的士兵数量为$a[x][i]$。

如果你需要攻下第i座城堡,你在第i座城堡部署的士兵必须严格大于$2a[x][i]$,如果攻下了你会获得$i$的收益。

对于这$s$轮游戏,你只能采用一种部署方式。

下面问你应该如何部署,使得你在这$s$轮游戏中的收益和最大。

数据范围:$n,s≤100$,$m≤2000$。

我们考虑直接$dp$,设$f[i][j]$表示前$i$个城堡部署了$j$名士兵的最大收益。

不难发现,$f[i][j]=\max\limits_{k≤j,k∈a[][i]} f[i-1][j-k]+val[i][k]$。

其中,$val[i][k]$表示你在第$i$城堡部署$k$个人的收益和。

直接$dp$就可以了,复杂度为$O(nms)$。

 1 #include<bits/stdc++.h>
 2 #define M 105
 3 #define N 20005
 4 using namespace std;
 5
 6 int f[M][N]={0},a[M][M]={0},val[M][M]={0};
 7 int s,n,m;
 8
 9 int main(){
10     scanf("%d%d%d",&s,&n,&m);
11     for(int i=1;i<=s;i++)
12     for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
13
14     for(int i=1;i<=n;i++){
15         for(int j=1;j<=s;j++){
16             for(int k=1;k<=s;k++)
17             if(a[j][i]>=a[k][i]) val[i][j]++;
18         }
19     }
20     for(int i=1;i<=n;i++)
21     for(int j=0;j<=m;j++){
22         f[i][j]=f[i-1][j];
23         for(int k=1;k<=s;k++)
24         if(j>a[k][i]*2){
25             f[i][j]=max(f[i][j],f[i-1][j-a[k][i]*2-1]+val[i][k]*i);
26         }
27     }
28     int maxn=0;
29     for(int i=1;i<=m;i++)
30     maxn=max(maxn,f[n][i]);
31     cout<<maxn<<endl;
32 }

原文地址:https://www.cnblogs.com/xiefengze1/p/10777638.html

时间: 2025-01-18 01:18:22

【BJOI2019】排兵布阵 DP的相关文章

LuoguP5322 [BJOI2019]排兵布阵(DP)

城为物,人为容,价值?排序后,一切都明了 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c); ++a) #define nR(a,b,c) for(r

[BJOI2019]排兵布阵

[BJOI2019]排兵布阵 题面 链接 题解 直接转化为分组背包 #include<bits/stdc++.h> using namespace std; inline int read() { int f = 1 , x = 0; char ch; do { ch = getchar(); if(ch=='-') f=-1; } while(ch<'0'||ch>'9'); do { x=(x<<3) + (x<<1) + ch - '0'; ch =

HDU 4539 郑厂长系列故事——排兵布阵 (状态压缩DP)

中文题,题意不再累赘. 思路:对于第 i 行的放士兵,影响它的只有第 i-1 行和 i-2 行,所以暴力枚举符合这三行的状态 state[i],state[j],state[k].  接下来就是二进制的巧妙应用了. 具体题解看代码注释!!! #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath&

HDU 4539郑厂长系列故事――排兵布阵(状压DP)

HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma comment(linker,"/STACK:102400000,102400000") 2 #include <map> 3 #include <set> 4 #include <stack> 5 #include <queue> 6 #i

HDU 4539 郑厂长系列故事――排兵布阵(状态压缩)

郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1954    Accepted Submission(s): 701 Problem Description 郑厂长不是正厂长 也不是副厂长 他根本就不是厂长 事实上 他是带兵打仗的团长 一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵. 根据以往的战

HDU 4539 郑厂长系列故事——排兵布阵

http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1708    Accepted Submission(s): 620 Problem Description 郑厂长不是正厂长 也不是副厂长 他根本就不是厂长 事实上

排兵布阵之线段树

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 42138    Accepted Submission(s): 17826 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就

HDU ACM 4539 郑厂长系列故事——排兵布阵-&gt;状态压缩DP

分析:dp[i][j][k]表示第i行状态为j,i-1行状态为k时的客房士兵的最大值. 曼哈顿距离是指:|x1-x2|+|y1-y2|. 当前行不仅与前一行有关,还和前两行有关,所以开数组的时候还要记录前两行的状态,所以开设三维数组. 每行可压缩为二进制集合,状态dp[i][j][k]为第i行为集合j,第i-1行为集合k,则状态方程dp[i][j][k] = max{dp[i-1][k][r]+cnt[j]  | 状态i,j,k要能够共存}(cnt[j]为j在二进制下的1的个数,即士兵数).第一

HDU 4539 郑厂长系列故事——排兵布阵 &lt;&lt;状压dp

思路 被这道题折磨死了,只是发上来纪念一下,思路同方格取数(1),我已经疯了! 代码 1 #include<bits/stdc++.h> 2 using namespace std; 3 int maze[110][15]; 4 int n,m; 5 vector<int> all[110]; 6 int dp[110][200][200]; 7 int num[1<<10]; 8 bool check(int r,int state) 9 { 10 for(int i