洗车
https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=336
如果我们考虑
于是我们设
发现我们不知道商店的价格,所以改为
枚举价格最低是
显然的性质:由于最低位置是
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=60,M=4010;
int f[N][N][M],g[N][N][M];
int n,m,a[M],K,b[M],c[M],ls[M],cnt[M],lst[M];
void print(int i,int j,int k){
printf("f[%d][%d][%d]=%d\n",i,j,k,f[i][j][k]);
}
void printg(int i,int j,int k){
printf("g[%d][%d][%d]=%d\n",i,j,k,g[i][j][k]);
}
void out(){
for(int l=1;l<=n;++l)
for(int r=l;r<=n;++r,puts("\n"))
for(int k=1;k<=K;++k)
print(l,r,k);
}
int main(){
#ifdef LOCAL
freopen("1.txt","r",stdin);
#endif
#ifndef LOCAL
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
#endif
cin>>n>>m;
for(int i=1;i<=m;++i)cin>>a[i]>>b[i]>>c[i],ls[i]=c[i];
sort(ls+1,ls+1+m);
K=unique(ls+1,ls+1+m)-ls-1;
for(int i=1;i<=m;++i)c[i]=lower_bound(ls+1,ls+1+K,c[i])-ls;
for(int len=1;len<=n;++len)
for(int l=1;l+len-1<=n;++l){
int r=l+len-1;
int tot=0;
for(int i=1;i<=m;++i)
if(l<=a[i]&&b[i]<=r)lst[++tot]=i;
for(int p=l;p<=r;++p){
memset(cnt+1,0,K*4);
for(int i=1;i<=tot;++i)
if(a[lst[i]]<=p&&p<=b[lst[i]])++cnt[c[lst[i]]];
for(int i=K;i;--i){
cnt[i]+=cnt[i+1];
f[l][r][i]=max(g[l][p-1][i]+g[p+1][r][i]+cnt[i]*ls[i],f[l][r][i]);
}
}
for(int i=K;i;--i)g[l][r][i]=max(g[l][r][i+1],f[l][r][i]);
}
// out();
cout<<g[1][n][1];
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/18317483
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-07-23 AlmostSorted
2023-07-23 YetAnotherGridTask
2023-07-23 Defect-freeSquares