HDU 1160 最长下降子序列(错误代码也可能通过,误导啊)

写的代码有点垃圾,改天优化一下。

#include <iostream>
#include <algorithm>
using  namespace std;
const int N = 1001;
int dp[N];
int front[N];
int p[N];
typedef struct  
{
	int weight;
	int speed;
	int num;
} mice;
mice mouse[N];

bool cmp(mice lhs, mice rhs)
{
	return lhs.weight < rhs.weight; //体重递增排序
}
int main()
{
	int t = 0;
	while(cin >> mouse[t].weight >> mouse[t].speed)
	{
		mouse[t].num = t + 1;
		t++;
	}
	sort(mouse, mouse + t, cmp);

	memset(dp, 0, sizeof(dp));
	memset(front, 0, sizeof(front));
	//最递减子序列
	for(int i = 0; i < t; i++)
	{
		dp[i] = 1;
		front[i] = -1;
		for(int j = i - 1; j >= 0; j--)
		{
			if(mouse[j].speed > mouse[i].speed && dp[j] + 1 > dp[i] && mouse[i].weight > mouse[j].weight)
			{
				dp[i] = dp[j] + 1;
				front[i] = j;
			}
		}
	}
	int max = 0;
	for(int i = 0; i < t; i++)
		if(dp[i] > dp[max])
			max = i;
	cout << dp[max] << endl;

	int k = 0;
	while(front[max] != -1)
	{
		p[k++] = mouse[max].num;
		max = front[max];
	}
	p[k++] = mouse[max].num;
	while(k--)
		cout << p[k] << endl;
	return 0;
}

写了初始版本后,偷懒参考了一篇代码,该代码提交能够AC,但是我跟他一样写的(只是他qsort,我用的sort),导致了我输出的结果一直很怪异。郁闷了半天。

通过输出比较,我发现qsort的只是将重量排序,而sort将速度也排序,导致的结果不同。而根本原因是,该代码只是碰巧可以通过,如果题目换个测试例子,将重量也递减,是不可能通过的。所以正确的做法应该是要判断重量是否相同,相同则不考虑。 该代码没有考虑重量,居然AC,使我一直以为不用判断重量,ac不了。一字一句地对照了半天。

非吐槽不可了。

#include <stdio.h>
#include <stdlib.h>
struct No
{
	int w;
	int s;
	int num;
}a[1005];
int cmp(const void *c,const void *d)
{
	return *(int *)c-*(int *)d;
}
int main ()
{
	int n=0,i,j,k,max;
	int m[1005],pre[1005],p[1005];
	while (scanf("%d %d",&a[n].w,&a[n].s)!=EOF)
	{
		a[n].num=n+1;
		n++;
	}
	qsort(a,n,sizeof(a[0]),cmp);
	for (i=0;i<n;i++)
	{
		m[i]=1;pre[i]=-1;
		for (j=i-1;j>=0;j--)
		{
			if (a[j].s>a[i].s && m[j]+1>m[i])
			{
				m[i]=m[j]+1;
				pre[i]=j;
			}
		}
	}
	for (max=0,i=0;i<n;i++)
		if (m[i]>m[max]) max=i;
	printf("%d\n",m[max]);
	k=0;
	while (pre[max]!=-1)
	{
		p[k++]=a[max].num;
		max=pre[max];
	}
	p[k++]=a[max].num;
	while (k--)
		printf ("%d\n",p[k]);
	return 0;
}


资源下载链接为: https://pan.quark.cn/s/502b0f9d0e26 在当下互联网蓬勃发展的时代,流媒体技术已然成为多媒体内容传播与分享的关键手段,而 m3u8 格式凭借其基于 HTTP Live Streaming (HLS) 的特性,在在线视频、直播等诸多领域被广泛应用。不过,普通用户若想把 m3u8 链接下载下来,再转换成像 MP4 这样的本地离线观看文件,往往离不开一款专业的工具——m3u8 下载器。本文将深入剖析 m3u8 下载器的功能特点,以及其如何助力用户实现多任务下载、突破速度限制、将 ts 文件合并为 MP4 格式,还有处理加密视频等诸多功能。 m3u8 下载器核心功能是能从 m3u8 播放列表里解析出 TS 分片文件,并进行批量下载。TS 即传输流,是流媒体传输中常见的数据包形式。该下载器支持多任务下载,用户可同时操作多个 m3u8 链接,对于有大量视频下载需求的用户而言,这大大提升了下载效率。而且,m3u8 下载器在合法合规的前提下,通过优化下载策略,突破了常规网络环境下部分网站对下载速度的限制,让用户能更快速地获取所需多媒体资源。 此外,m3u8 下载器还能把 TS 文件合并成 MP4 文件。TS 文件是流媒体数据的片段,MP4 则是一种通用且便于存储、播放的格式。下载器会自动按顺序将所有 TS 文件合并,生成完整的 MP4 文件,极大简化了用户操作。更关键的是,它支持处理采用 AES-128-CBC 加密的 TS 文件。AES 是广泛使用的加密标准,CBC 是其工作模式之一,对于这类加密的 m3u8 视频,下载器能自动识别并解密,保障用户正常下载、播放加密内容。 m3u8 下载器还对错误进行了修正,优化了性能,有效解决了下载中断等问题,确保下载过程稳定。同时,软件在设计时将安全性作为重点,注重保护用户隐私,规避下载过程中的安全风
资源下载链接为: https://pan.quark.cn/s/27aaeeaf622d R语言是一种开源编程语言,广泛应用于统计分析、数据挖掘、机器学习和图形绘制等领域,凭借其强大的数据处理能力和丰富的统计分析库而受到广泛欢迎。R-4.2.2-win.zip是专为Windows系统设计的R语言安装包,包含了在Windows环境下运行R所需的所有组件。以下是R语言的安装过程: 下载:从R官方网站或镜像站点下载Windows版本的安装包,例如R-4.2.2-win.zip。该zip文件中通常包含一个可执行的安装程序,如R-4.2.2-win.exe。 解压:使用解压缩工具(如WinRAR或7-Zip)解压R-4.2.2-win.zip文件,以释放出R的安装程序R-4.2.2-win.exe。 运行安装程序:双击R-4.2.2-win.exe启动安装过程。安装向导会引导用户完成安装步骤,包括选择安装路径、设置环境变量以及选择安装类型(默认、最小化或自定义)。 配置环境:在安装过程中,用户可以选择是否将R添加到系统路径,以便在命令行中直接运行R。此外,还可以选择安装集成开发环境(IDE),如RStudio,以提升编程体验。 安装依赖库:R语言的强大之处在于其丰富的第三方包。在初次启动R时,用户可能需要通过install.packages()函数安装一些常用包,例如用于数据可视化的ggplot2、用于数据操作的dplyr和用于数据整理的tidyr等。 验证安装:安装完成后,启动R Console或RStudio,并输入sessionInfo()命令,以查看当前R版本和其他相关信息,从而确认安装成功。 更新与维护:R语言会定期更新,以修复问题并引入新功能。用户可以通过R Console中的update.packages()命令更新R及其包,确保始终使用最新版本。 学习资源:初学者可以
### HDU 1159 最长公共子序列 (LCS) 解题思路 #### 动态规划状态定义 对于两个字符串 `X` 和 `Y`,长度分别为 `n` 和 `m`。设 `dp[i][j]` 表示 `X[0...i-1]` 和 `Y[0...j-1]` 的最长公共子序列的长度。 当比较到第 `i` 个字符和第 `j` 个字符时: - 如果 `X[i-1]==Y[j-1]`,那么这两个字符可以加入之前的 LCS 中,则有 `dp[i][j]=dp[i-1][j-1]+1`[^3]。 - 否则,如果 `X[i-1]!=Y[j-1]`,那么需要考虑两种情况中的最大值:即舍弃 `X[i-1]` 或者舍弃 `Y[j-1]`,因此取两者较大者作为新的 LCS 长度,即 `dp[i][j]=max(dp[i-1][j], dp[i][j-1])`。 时间复杂度为 O(n*m),其中 n 是第一个字符串的长度而 m 是第二个字符串的长度。 #### 实现代码 以下是 Python 版本的具体实现方式: ```python def lcs_length(X, Y): # 初始化二维数组用于存储中间结果 m = len(X) n = len(Y) # 创建(m+1)x(n+1)大小的表格来保存子问题的结果 dp = [[0]*(n+1) for _ in range(m+1)] # 填充表项 for i in range(1, m+1): for j in range(1, n+1): if X[i-1] == Y[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) return dp[m][n] # 测试数据输入部分可以根据具体题目调整 if __name__ == "__main__": while True: try: a = input().strip() b = input().strip() result = lcs_length(a,b) print(result) except EOFError: break ``` 此程序会读入多组测试案例直到遇到文件结束符(EOF)。每组案例由两行组成,分别代表要计算其 LCS 的两个字符串。最后输出的是它们之间最长公共子序列的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值