[BJOI2019]排兵布阵(动态规划)
规划 动态
2023-09-11 14:14:40 时间
[BJOI2019]排兵布阵(动态规划)
题面
题解
暴力dp:
设\(f[i][j]\)表示考虑到了第\(i\)座城市用了\(j\)人的最大收益,枚举在这个城市用多少人就可以了。
优化:
发现用的人数一定是某个敌人的人数的二倍加一,那么决策只有\(O(s)\)个。
时间复杂度\(O(snm)\)。(不满)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int S,n,m,f[101][20020];
vector<int> A[105];
int main()
{
S=read();n=read();m=read();
for(int i=1;i<=S;++i)
for(int j=1;j<=n;++j)A[j].push_back(read());
for(int i=1;i<=n;++i)sort(A[i].begin(),A[i].end());
memset(f,-63,sizeof(f));f[0][0]=0;
for(int i=1,s=0;i<=n;++i)
{
int l=A[i].size()-1;
for(int p=-1;p<=l&&2*A[i][p]+1<=m;++p)
{
int j=(~p)?2*A[i][p]+1:0;
for(int k=0;k<=s&&k+j<=m;++k)
f[i][j+k]=max(f[i][j+k],f[i-1][k]+i*(p+1));
}
s+=A[i][l]*2+1;
}
int ans=0;
for(int i=0;i<=m;++i)ans=max(ans,f[n][i]);
printf("%d\n",ans);
return 0;
}
相关文章
- 【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)
- 【UOJ#311】【UNR #2】积劳成疾(动态规划)
- 【BZOJ1294】[SCOI2009]围豆豆(动态规划,状压)
- 【BZOJ1226】学校食堂(动态规划,状态压缩)
- 【BZOJ2727】双十字(动态规划,树状数组)
- 【BZOJ3611】大工程(虚树,动态规划)
- 【BZOJ5290】[HNOI2018]道路(动态规划)
- 【BZOJ3566】概率充电器(动态规划)
- 【BZOJ3530】数数(AC自动机,动态规划)
- Java自学指南七、规划
- 【BZOJ3939】[Usaco2015 Feb]Cow Hopscotch 动态规划+线段树
- 让你轻松搞懂0-1背包问题(动态规划 C语言版)
- 动态规划(DP)之多边形游戏问题
- [算法]死磕递归和动态规划专题算法
- 动态规划高频题目
- CodeForces 611C New Year and Domino (动态规划,DP)
- WPF之资源规划
- 强化学习学习笔记(二)-基于模型的动态规划方法
- 动态规划入门专题
- LeetCode动态规划基础题-子字符串问题(13题)
- LeetCode1143之最长公共子序列和最长公共子串(相关话题:动态规划)
- 【算法/动态规划/股票问题】题解+详细备注(共6题)
- POJ1088 动态规划
- nyoj 311-完全背包 (动态规划, 完全背包)
- 闽信息通信“十三五”规划发布