【JZOJ4931】A
来源:互联网 发布:理解大数据 编辑:程序博客网 时间:2024/04/30 01:43
Description
有N家洗车店从左往右排成一排,每家店都有一个正整数价格Pi。
有M个人要来消费,第i个人会驶过第Ai个开始一直到第Bi个洗车店,且会选择这些店中最便宜的一个进行一次消费。但是如果这个最便宜的价格大于Ci,那么这个人就不洗车了。
请给每家店指定一个价格,使得所有人花的钱的总和最大。
Solution
先把数离散化。
考虑区间dp,设
枚举中间的一个位置
我们考虑怎么求这个奇怪的东西(也就是跨越中间p的贡献),那我们显然要知道
设这个人数为
那么总的方程:
因为我们
Code
#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define max(a,b) ((a)>(b))?(a):(b)#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)#define N 55#define M 4010#define MAX 500010using namespace std;int a[M],b[M],c[M],cc[M];int ls[MAX],yl[M],tt=0;int f[N][N][M],g[N][M];int main(){ int n,m; scanf("%d %d",&n,&m); fo(i,1,m) scanf("%d %d %d",&a[i],&b[i],&c[i]),cc[i]=c[i]; sort(cc+1,cc+m+1); fo(i,1,m) { ls[cc[i]]=++tt; yl[tt]=cc[i]; } fo(len,1,n) fo(l,1,n-len+1) { int r=l+len-1; memset(g,0,sizeof(g)); fo(i,1,m) if(a[i]>=l && b[i]<=r) fo(j,a[i],b[i]) g[j][ls[c[i]]]++; fo(i,l,r) fd(j,tt-1,1) g[i][j]+=g[i][j+1]; fo(i,l,r) fd(x,tt,1) f[l][r][x]=max(max(f[l][r][x],f[l][r][x+1]),f[l][i-1][x]+f[i+1][r][x]+g[i][x]*yl[x]); } printf("%d",f[1][n][1]);}
1 0
- [JZOJ4931] A
- 【JZOJ4931】A
- 【jzoj4931】【bzoj4380】【POI2015】【Myjnie】【动态规划】
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- A
- A*
- C++ 输入函数 cin>>、cin.getline()和cin.get()区别
- 杭电2023
- 二维码简介和容错率的问题
- 安装 flask
- shell脚本小程序之特洛伊木马示例
- 【JZOJ4931】A
- 构建基于 NodeJS 的 LESS.js 预编译 CSS 服务
- POJ-3984迷宫问题(典型BFS找最短路径)
- git建分支并上传
- C++(20):STL初步之set初步
- django中数据库一对一,一对多,多对多关系
- 报表打印技术-web打印
- 光栅化插值方法-透视除法
- spark官方文档