当前位置: 首页 > article >正文

dp+差分数组

前言:怎么也没想到要用dp来做,并且这个题目中如果列为1的话还要特殊考虑


题目地址

在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

//#define int long long
const int N = (int)5e3 + 10;
int dp[N][N][2]; // 0 表示上端点,1表示下端点
int t;
int n, m;
int a[N];
int chafen[N];
signed main() {
	cin >> t;
	while (t--) {
		cin >> n >> m;
		for (int i = 0; i <= n; i++) {
			for (int j = 0; j <= m; j++) {
				dp[i][j][0] = dp[i][j][1] = 0;
				a[i] = 0;
			}
		}
		for (int i = 1; i <= m; i++) {
			cin >> a[i];
		}
		for (int i = 1; i <= n; i++) {
			dp[i][1][0] = dp[i][1][1] = 1; // 第一列中都可以当端点
		}
		for (int j = 2; j <= m - 1; j++) {
			if (a[j] == 1) {
				//vector<int> chafen(n + 2, 0);
				for (int i = 0; i < n + 2; ++i)
					chafen[i] = 0;
				for (int k = 1; k <= n; k++) {
					if (dp[k][j - 1][0]) chafen[k]++;
					if (dp[k][j - 1][1]) chafen[k + 1]--;
				}
				int cnt = 0;
				for (int k = 1; k <= n; k++) {
					cnt += chafen[k];
					if (cnt) {
						dp[k][j][0] = dp[k][j][1] = 1;
					}
				}
				continue;
			}
			for (int i = 1; i <= n; i++) {

				if (dp[i][j - 1][0]) {
					if (i - a[j] + 1 >= 1) {
						dp[i][j][1] = 1;
						dp[i - a[j] + 1][j][0] = 1;
					}
				}
				if (dp[i][j - 1][1]) {
					if (i + a[j] - 1 <= n) {
						dp[i][j][0] = 1;
						dp[i + a[j] - 1][j][1] = 1;
					}
				}
			}
		}
		//for (int i = 1; i <= n; i++) {
		//	cout << dp[i][2][0] << " " << dp[i][2][1] << endl;
		//}
		//vector<int> chafen(n + 2, 0);
		for (int i = 0; i < n + 2; ++i)
			chafen[i] = 0;
		for (int i = 1; i <= n; i++) {
			if (dp[i][m - 1][0]) chafen[i]++;
			if (dp[i][m - 1][1]) chafen[i + 1]--;
		}int cnt = 0; int ans = 0;
		for (int i = 1; i <= n; i++) {
			cnt += chafen[i];
			if (cnt) ans++;
		}
		cout << ans << endl;
	}
	return 0;
}

http://www.kler.cn/a/283991.html

相关文章:

  • 基于海思soc的智能产品开发(两个图像处理来源)
  • linux设置主机名
  • 爱普生SG-8200CJ可编程晶振在通信设备中的应用
  • 蔚来Java面试题及参考答案
  • openSUSE 环境下通过 zypper 安装软件
  • WebRTC API分析
  • 8.29笔记
  • 组合式API-reactive和ref函数,computed计算属性,watch函数
  • NASA数据集:ASO L4雷达雪神数据集
  • BSV区块链发布Golang软件开发工具包
  • 开源网络安全大模型 - SecGPT
  • tcp/udp 可视化 调试工具; tcp/udp 发送客户端;查看tcp连接;netassist;packet sender;tcp view;
  • 【JavaEE初阶】HTTP响应报文
  • 【C++STL详解(十三)】unordered系列容器的介绍与使用
  • linux驱动--中断等待队列
  • 在docker镜像中使用java生成图片,图片中文字乱码,将文件存入虚拟机,然后打压缩包,文件名乱码
  • LLaMA-Factory微调入门个人重制版
  • 基于Python的热门旅游景点数据分析系统【python-爬虫-大数据定制】
  • axios取消请求CancelToken的原理解析及用法示例
  • C语言练习题 包含min函数的栈
  • EmguCV学习笔记 VB.Net 8.2 分水岭法 watershed
  • 谈谈 Python 可迭代对象的实现
  • udp可靠传输中ACK与NACK的选择
  • Memcached stats sizes 命令
  • OS库学习之rename(函数)
  • python数据分析——网络爬虫和API