首页 > 其他分享 >做题记录

做题记录

时间:2023-08-05 19:22:50浏览次数:37  
标签:数字 记录 int 任务 maxn 转移 dp

P1280 尼克的任务

题意:

题目传送门

思路:

很明显这一道dp题目,考虑dp[i]的含义,容易想到表示1~n时间内摸鱼时间的最大值。
接下来考虑转移方程。考虑在时间为i时到达岗位开始工作,即在岗时间为i~n。此时如果有任务且不在工作状态,即可考虑从任务结束时间转移过来(在结束时间时未已在任务中)。不难看出这种方式有一个特点,即逆序循环到第i位时,一定处于任务开始或摸鱼状态,因为任务时往后计算的,不对前面有影响。所以在转移时不用担心转移的位置处于任务中。

转移方程:

如果当前位置没有任务,那么\(dp[i] = dp[i+1] + 1\)
如果当前位置有任务,那么\(dp[i] = max(dp[i], dp[i+v[i][j]])\) (v[i][j]表示第i个数的任务的结束位置)

代码

#include <bits/stdc++.h> 
using namespace std;
const int maxn = 1e4+5;
int n, k;
vector<int>v[maxn];
int dp[maxn];

//bool fk(sb s, sb b){
//	return s.st < b.st;
//}

int main(){
	scanf("%d%d", &n, &k);
//	for(int i=1; i<=k; i++) pos[i] = 0;
	for(int i=1; i<=k; i++){
		int p, t;
		scanf("%d%d", &p, &t);
		v[p].push_back(t);
//		a[i].st = p, a[i].end  =t;
//		pos[st]++;
	}
	int pos=1; 
	//sort(a+1, a+1+k, [](sb s, sb b) {return s.st<b.st;});
	for(int i=n; i>=1; i--){
		if(v[i].size() == 0) dp[i] = dp[i+1] + 1;
		else{
			for(int j=0; j<v[i].size(); ++j){
//				if(a[j].end == i) dp[i] = max(dp[i], dp[i+a[j].end]);
				dp[i] = max(dp[i], dp[i+v[i][j]]);
			}
		}       
	}
	printf("%d", dp[1]);
}

P4310 绝世好题

题意

给定长度为\(n\)(\(n \leqslant 1e5\))的整数数列\(a\)(\(a_i \leqslant 10^9\)),求a的最长子序列长度,满足子序列相邻元素按位与结果均不为\(0\)。

思路

首先想到的是\(O(n^2)\)的暴力算法:\(dp[i]\)表示以a_i为结尾的序列的最长长度,据题意则可以得到状态转移方程对于\(i \leqslant n, j<i\),则若 \(a_i \And a_j, 则dp[i] = max(dp[i], dp[j]+1)\),即本身\((dp[i])\)和以前一位数(第\(j\)位)为结尾的序列的最大值\((dp[j])\)加1。最后的答案即为\(f[i]\)的最大值,因为长度最长的序列的结尾不一定是最后一位:)。
然后您喜提 \(\color{Green}90\) 分的高分:)。

然后我们就必须优化一下:(。
接下来便是了\(O(n)\) 的算法。之前是遍历数组,比较每一个数字是否符合条件。然后我们其实可以在得到每一个数字时判断它第j位(二进制位)是否为1,因为只有有一位都有1的两个数才能相邻。所以可以更改一下dp[i][j]的含义,即为表示最后一个数字第j位为1的最长子序列长度。

转移方程

若第i个数字第j位为1, \(dp[i][j] = max(dp[i-1][k]) + 1\), 其中k为数字i中为1的位。
若第i个数字第j位不为1,\(dp[i][j] = dp[i-1][j]\)

代码

#include <bits/stdc++.h> 
using namespace std;
const int maxn = 32;
int f[maxn];

int main(){
	int n, mx, ans=mx=0;
	scanf("%d", &n);
//	for(int i=1; i<=n; i++) scanf("%d", &a[i]);
//	for(int i=1; i<=n; i++) f[i]=1;
//	for(int i=1; i<=n; i++){
//		f[i] = 1
//		for(int j=1; j<i; j++){
//			if(a[i] & a[j]) f[i] = max(f[i], f[j]+1); 
//		}
//		ans = max(ans, f[i]);
//	}
	for(int i=1; i<=n; i++){
		int x;
		scanf("%d", &x);
		for(int j=0; j<=31; j++) if((1<<j) & x) mx = max(mx, f[j]+1);
		for(int j=0; j<=31; j++) if((1<<j) & x) f[j] = max(mx, f[j]);
		ans = max(mx, ans);
	}
	printf("%d\n", ans);
}

标签:数字,记录,int,任务,maxn,转移,dp
From: https://www.cnblogs.com/niuerdao/p/17607827.html

相关文章

  • 记录--说一说css的font-size: 0
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助平常我们说的font-size:0;就是设置字体大小为0对吧,但是它的用处不仅仅如此哦,它还可以消除子行内元素间额外多余的空白!问题描述?是否出现过当多个img标签平铺的时候,会出现几个像素的间距?就像这样......
  • 8.5做题记录
    上午1#include<bits/stdc++.h>2#defineintlonglong3usingnamespacestd;4intans[20],s;5signedmain()6{7freopen("x3.in","r",stdin);8freopen("x3.out","w",stdout);9intn,l,......
  • MySQL Server 5.5的安装及遇到问题记录
    一、安装安装没有什么说的,不会看图(版本,我选择自定义——Custom,供参考)                        --------------------------------------------------------------------------二、问题记录:安装后遇到的问题 1.安装mysql......
  • 8.4做题记录
    上午1#include<bits/stdc++.h>2usingnamespacestd;3intmain()4{5freopen("str.in","r",stdin);6freopen("str.out","w",stdout);7strings="a";8intn,k;9cin&......
  • 一文弄懂什么是DNS、A记录、CNAME以及使用方法
    域名解析DNS简介域名解析(DomainNameSystem,DNS)是互联网中用于将人类可读的域名(例如www.example.com)转换为计算机可理解的IP地址(例如192.168.1.1)的系统。它充当了互联网上的一个“电话簿”,帮助将用户提供的域名映射到实际的网络地址,使得计算机能够找到并连接到相应的网络服务器。白......
  • jenkins 远程 ssh 部署问题记录
    脚本执行失败注意需要在sh脚本里面添加source/etc/profile脚本执行失败排查可以在jenkins的ssh命令添加日志,然后查看日志排错nohupsh/xx/xx.sh>/xx/xx.log2>&1&脚本编写注意事项在脚本开头添加cd到当前目录,确保脚本内部读取的路径正常......
  • GB28181智慧可视化指挥控制系统之执法记录仪设计探讨
    什么是智慧可视化指挥控制系统?智慧可视化指挥控制平台通过4G/5G网络、WIFI实时传输视音频数据至指挥中心,特别是在有突发情况时,可以指定一台执法仪为现场视频监控器,实时传输当前画面到指挥中心,指挥中心工作人员可通过麦克风向现场执法人员下达指令(语音广播或语音对讲)。本文主要介绍......
  • 电脑版微信聊天记录恢复导出工具(文字/语音/图片/视频/文件/表情包)
    PC版微信的聊天记录加密保存在电脑中,有时我们想将自己微信中的聊天记录导出来,但微信软件并不提供该功能。此软件可将自己电脑版微信中的聊天内容批量导出来。下载地址1:点击下载下载地址2:https://weijiesoft.lanzouw.com/i2oZq14gh19e可按照联系人名称创建文件夹自动分类,包括:文......
  • 实习随笔记录---写给自己看,不给任何人意见
    不要被贩卖焦虑......
  • CTFer成长记录——CTF之Web专题·攻防世界-Web_python_template_injection
    一、题目链接https://adworld.xctf.org.cn/challenges/list二、解法步骤  python的flask模板注入的题思路比较固定,Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。1.猜测是否存在注入:直接在url后面加上{{config}}2.获取基本......