UVA_10534_Wavio Sequence

本文介绍了一种求解最长递增子序列(LIS)问题的高效算法,并通过一个具体的C++实现示例展示了该算法的工作原理。文章还提供了一个主函数用于读取输入并输出结果,展示了如何结合二分查找优化LIS算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#pragma warning(disable:4996)
using std::cin;
using std::cout;
using std::endl;
using std::stringstream;
using std::string;
using std::vector;
using std::list;
using std::pair;
using std::set;
using std::multiset;
using std::map;
using std::multimap;
using std::stack;
using std::queue;
using std::priority_queue;
int BinarySearch(const vector<int>&value,const vector<int>&vec,const int &val)
{
	int low = 0, high = vec.size() - 1;
	while (low <= high)
	{
		auto mid = (low + high) / 2;
		if (val <=value[vec[mid]])
		{
			high = mid-1;
		}
		else if (val == value[vec[mid]])
		{
			low = mid;
		}
		else
		{
			low = mid+1;
		}
	}
	return low;
}
vector<int>LIS(const vector<int>&value)
{
	vector<int>dp(value.size());
	dp[0] = 1;
	vector<int>vec{ 0 };
	for (size_t i = 1; i < value.size(); i++)
	{
		if (value[i] > value[vec.back()])
		{
			
			dp[i] = dp[vec.back()] + 1;
			vec.push_back(i);	
		}
		else
		{
			auto index = BinarySearch(value, vec,value[i]);//返回符合要求的第一个数在栈中的位置
			dp[i] = dp[vec[index]];
			vec[index] = i;
		}
	}
	return dp;
}
int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	int n;
	while (cin>>n)
	{
		vector<int>value(n);
		for (int i = 0; i < n; i++)
		{
			cin >> value[i];
		}
		auto dp1 = LIS(value);
		std::reverse(value.begin(), value.end());
		auto dp2 = LIS(value);
		std::reverse(dp2.begin(),dp2.end());
		int index = 0;
		for (int i = 1; i < n; i++)
		{
			if (std::min(dp1[index], dp2[index]) < std::min(dp1[i], dp2[i]))
			{
				index = i;
			}
		}
		cout << std::min(dp1[index], dp2[index])*2-1<< endl;
	}
	return 0;
}

在UVM(Universal Verification Methodology)中,sequence库是一个非常重要的组件,它允许用户生成受控的激励,以测试设计的功能和边界条件。通过使用sequence机制,可以动态地控制测试用例的生成方式,并且能够复用已有的激励模式,从而提高验证效率。 sequence的基本概念是将一系列事务(transaction)组织成一个逻辑序列,并通过sequencer发送到driver中执行。为了实现这一目标,UVM提供了`uvm_sequence`类作为所有自定义sequence的基础类。每个sequence必须与特定的transaction类型相关联,并且可以通过重写`body()`方法来定义具体的事务行为[^1]。 ### Sequence库的使用 UVM中的sequence库提供了一些预定义的sequence,例如: - `uvm_random_sequence`: 用于生成随机化的事务。 - `uvm_exhaustive_sequence`: 按照某种顺序遍历所有可能的输入组合。 - `uvm_status_sequence`: 用于检查DUT的状态寄存器等信息。 这些sequence可以直接使用或者通过继承进行扩展,以满足特定的测试需求。例如,创建一个简单的sequence来生成多个读写操作: ```systemverilog class my_simple_sequence extends uvm_sequence #(my_transaction); `uvm_object_utils(my_simple_sequence) function new(string name = "my_simple_sequence"); super.new(name); endfunction virtual task body(); my_transaction tr; repeat (5) begin tr = my_transaction::type_id::create("tr"); start_item(tr); assert(tr.randomize()); finish_item(tr); end endtask endclass ``` 在这个例子中,`my_simple_sequence`会生成五个随机化的事务实例,并通过sequencer发送出去。这种结构非常适合用于创建可重复使用的测试场景。 ### Sequence的实现指南 要正确地实现一个sequence,需要注意以下几个关键点: 1. **SequenceSequencer绑定**:每个sequence需要指定其关联的sequencer,这通常是通过调用`start()`方法时传入sequencer参数完成的。 2. **Item的生命周期管理**:在`body()`任务中,每次生成新的transaction时都需要调用`start_item()`和`finish_item()`来管理item的生命周期。 3. **Randomization控制**:可以在`body()`内部对transaction进行随机化,也可以根据测试需求手动设置某些字段值。 4. **Priority和Preemption**:UVM支持为sequence设置优先级,并且允许高优先级的sequence抢占低优先级的sequence正在执行的任务。 5. **嵌套Sequence**:可以通过调用其他sequence来构建更复杂的测试场景,这种方式称为嵌套sequence。 此外,UVM还提供了`uvm_sequencer_analysis_fifo`、`uvm_sequencer`以及`uvm_driver`等组件来协助sequence的管理和执行。 ### Sequence Library的高级特性 UVM sequence库还包括一些高级特性,如: - **Virtual Sequences**:虚拟sequence不直接产生事务,而是协调多个物理sequencer上的sequence执行。 - **Sequences with Constraints**:可以为sequence中的transaction添加额外的约束条件,以限制随机化范围。 - **Sequence Libraries and Factories**:利用UVM工厂机制,可以方便地替换或扩展默认的sequence实现。 通过合理利用这些高级特性,开发者可以构建出更加灵活和强大的验证环境。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值