首页 > 其他分享 >【解题报告】Power收集

【解题报告】Power收集

时间:2022-09-20 09:12:53浏览次数:89  
标签:ch Power 收集 int max 解题 include dp val

东方Project相关试题 Power收集

(注:我不是东方众哦 但下次回家可以试着玩一下

传送门

先读题啦

n*m矩阵,其中有K个格子上有P点,价值val[i][j],从第一行任意格子出发,每秒向下走一行,左右最多各走T格,问能收集的最大val

先想想暴力のDP

这不就是IOI1994那道大水题咩!???

暴力转移一下

可以设dp[i][j]为到达(i,j)时的max值,O(n^3)

dp[i][j]=max(dp[i-1][k]+val[i][j])(k属于什么大家都知道吧。。。不想打数学符号了)

只有40pts。。。那我也把代码放出来好啦,养成写暴力的好习惯

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define int long long

using namespace std;

const int maxn=4010;

inline int read()
{
	int w=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-')
		{
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		w=(w<<3)+(w<<1)+(ch^48);
		ch=getchar();
	}
	return w*f;
}

int n,m,k,t;

int val[maxn][maxn];

int dp[maxn][maxn];

signed main()
{
	n=read();
	m=read();
	k=read();
	t=read();
	
	for(int i=1;i<=k;i++)
	{
		int x=read();
		int y=read();
		val[x][y]=read();
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			for(int k=max(1ll,j-t);k<=min(m,j+t);k++)
			{
				dp[i][j]=max(dp[i][j],dp[i-1][k]+val[i][j]);
			}
		}
	}
	
	int ans=0;
	
	for(int i=1;i<=m;i++)
	{
		ans=max(ans,dp[n][i]);
	}
	
	cout<<ans;
	
	return 0;
}

单调队列优化

对于每一行的某个值,都是在上一行可行的范围里选一个最大的加上这个val,如何在上一行搞一个max值呢?我们发现,每一行找max值时都是在一个固定的区间长度内的,就像是一个区间从左到右滑。。。

从左向右滑???滑动。。。窗口???

那不就是单调队列么(O(n*m))

用它维护每一(i-1)行的max值就好啦,代码很短的

AC 代码

#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
#include<deque>
#include<algorithm>

using namespace std;

const int maxn=4010;

inline int read()
{
	int w=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-')
		{
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		w=(w<<3)+(w<<1)+(ch^48);
		ch=getchar();
	}
	return w*f;
}

int n,m,k,t;

int dp[maxn][maxn];

int val[maxn][maxn];

int main()
{
	n=read();
	m=read();
	k=read();
	t=read();
	
	for(int i=1;i<=k;i++)
	{
		int x=read();
		int y=read();
		val[x][y]=read();
	}
	
	for(int i=1;i<=n;i++)
	{
		deque <int> q;
		
		int r=0;
		
		for(int j=1;j<=m;j++)
		{
			while(r<m && r<j+t)
			{
				r++;
				while(!q.empty() && dp[i-1][q.back()]<=dp[i-1][r])
				{
					q.pop_back();
				}
				q.push_back(r);
			}
			
			while(!q.empty() && (j-t)>q.front())
			{
				q.pop_front();
			}
			
			dp[i][j]=dp[i-1][q.front()]+val[i][j];
		}
	}
	
	int ans=0;
	
	for(int i=1;i<=m;i++)
	{
		ans=max(ans,dp[n][i]);
	}
	
	cout<<ans;
	
	return 0;
}

どんなに美しく犠牲になるかを考えるよりも、どうやって最後まで美しく生きるかを考えてみましょう。

标签:ch,Power,收集,int,max,解题,include,dp,val
From: https://www.cnblogs.com/SitoASK/p/16709836.html

相关文章

  • 【Coel.解题报告】【没事找事】CSP-S2 真题解析
    昨天刚考完CSP-S1,反正没什么想做的(最近好颓废…),来复盘一下。本次比赛评价(转载):CSP-S1是由CCF自主研发的一款全新开放世界冒险游戏。游戏发生在一个被称作「基数排序......
  • P7856 「EZEC-9」模糊众数 解题报告
    P7856「EZEC-9」模糊众数解题报告:题意给定一个长度为\(n\)的序列,一次操作可以将某个数字加一,多次询问一个数\(x\),求使得\(x\)称为序列众数至少要多少次操作。\(1......
  • PowerShell 函数
    Powershell中的函数使用关键字(function)声明,后面依次跟函数名称、左右大括号。函数将执行的代码包含在这些大括号中。#创建函数FunctionGetPSversion{......
  • ARC147F Again ABC String 解题记录
    题意:给定整数\(X,Y,Z\),称一个字符串\(S\)合法,当且仅当:\(|S|=n\)仅由字符\(\texttt{A,B,C}\)构成。对每个\(i\)满足:记\(A_i,B_i,C_i\)表示\(S\)前\(i\)......
  • Logstash深入收集Nginx日志
    Logstash深入收集Nginx日志安装nginx[root@elkstack03~]#yuminstall-ynginx##主配置文件[root@elkstack03~]#cat/etc/nginx/nginx.confusernginx;worker......
  • Logstash深入收集Java日志
    Logstash深入收集Java日志没有修改Json格式在企业中,我们看到tomcat日志遇到异常(exception)一条日志可能是几行或者十几行甚至几十行,组成的,那么,我们需要将多行日志变成......
  • 记如何让Visual Studio、Powershell和Git for Windows和谐共处
    目录前言环境解决方案步骤原理前言VisualStudio在2019版本中正式加入了对Git的支持。但如果未进行过相关的环境配置,在VS中使用内置Git将无法与SSH仓库同步。尤其是习惯......
  • PowerShell 哈希表 @{}
    PowerShell哈希表是一种数据结构,用于存储键值对(也称为字典或者关联数组)语法:$Var=@{<key1>=<value1>;<key2>=<value2>;.....;<keyN>=<valueN>;}examp......
  • 安装PowerCLI
    1.使用powershell直接安装Install-ModuleVMware.PowerCLI-ScopeCurrentUser2.下载安装包后解压,将模块复制到powershell的模块目录1在官网下载ZIP包:https://devel......
  • delphi 各新版本特性收集(转)
    DelphiXE6新增了一些特性并增强了原有的功能,主要有以下几个方面: IDE(整合开发环境) InternetXML(扩展标记语言)Compiler(编译器)COM/ActiveXDatabasesupport(数据库......