前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2019牛客暑期多校训练营(第六场)J Upgrading Technology 后缀和

2019牛客暑期多校训练营(第六场)J Upgrading Technology 后缀和

作者头像
用户2965768
发布2019-08-14 14:33:02
3510
发布2019-08-14 14:33:02
举报
文章被收录于专栏:wym

题意:有i个技能,每次升级都有花费cij,然后所有技能都达到j级送dj块钱,问你最多能赚多少

解:先将花费乘-1转换为收益,对 a[i][j] 维护后缀和,表示 j+1~m 最大收益。

然后 j 从1 到 m 遍历,j 表示当前某个技能的最低等级,找到 第 i 个技能 最小的后缀和,减去这个后缀和并加上其他技能的后缀和,再加上所以技能都达到 j 的收益取最大值。

代码语言:javascript
复制
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll sum[1005][1005];
int d[1005];
int a[1005][1005];
int main() {
	int cnt=1,t,n,m;
	scanf("%d",&t);
	while(t--) {
		scanf("%d %d",&n,&m);
		for(int i=1; i<=n; i++)
			for(int j=1; j<=m; j++)scanf("%d",&a[i][j]),a[i][j]=-a[i][j];
		for(int i=1; i<=m; i++)scanf("%d",&d[i]);
		
		for(int i=1;i<=n;i++){
			sum[i][m] = 0;
			for(int j=m-1;j>=0;j--){
				sum[i][j] = max(0ll,sum[i][j+1]+a[i][j+1]);
			}
		}
		ll now = 0,ans = 0;
		for(int j=0;j<=m;j++){
			for(int i=1;i<=n;i++)now+=a[i][j];
			now+=d[j];
			ll tp = 0,mi = 1e18;
			for(int i=1;i<=n;i++)tp+=sum[i][j],mi = min(mi,sum[i][j]);
			ans = max(ans,tp-mi+now);
		}
		printf("Case #%d: %lld\n",cnt++,ans);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年08月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档