UVA-10635 LCS转化为LIS

本文介绍了一种将最长公共子序列(LCS)问题转化为最长递增子序列(LIS)问题的高效算法,适用于两个序列中每个元素各不相同的情况。通过哈希变换将原始数据映射为新的序列,并利用LIS算法求解,降低了时间复杂度至O(nlogn),文中还提供了完整的C++实现代码。

题意:给定两个序列一个长度为p+1,一个为q+1,求两序列的LCS,序列中每个数字不重复,最大值为n*n,n不大于250。

思路:每个数都不重复,所以可以将源数据和下标置换,对数列做一个哈希变换,另一个数列也做相同的变换就可以的到一个新的数列。可以转换为求新序列的LIS。时间复杂度就会降到O(nlogn)。原因可以这样思考,由于b中的数字是通过a的变换得到的,所以b的所有子集都是a的一个子集,但是顺序不确定。考虑b的LIS,它一定是a的一个子集,这个子集是a中从左到右的(b中的递增序列),所以一定是b和a的公共序列,由于LIS最长,所以是LCS。

#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string>
#include <cstring>
#include <map>
#include <vector>
#include <iostream>
#include <string.h>
using namespace std;

typedef long long ll;
const int maxn = 300*300;

int dp[maxn];
int a[maxn],b[maxn];
int n,p,q;

int lis()
{
    memset(dp,0,sizeof(dp));
    int len=1;
    dp[0]=b[0];
    for(int i=1;i<q+1;i++){
        int pos=lower_bound(dp,dp+len,b[i])-dp;
        dp[pos]=b[i];
        len=max(len,pos+1);
    }
    return len;
}

int main()
{
    int t,kase=1;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&n,&p,&q);
        for(int i=0;i<p+1;i++){
            int tmp;
            scanf("%d",&tmp);
            a[tmp]=i+1;
        }

        for(int i=0;i<q+1;i++){
            int tmp;
            scanf("%d",&tmp);
            b[i]=a[tmp];
        }
        int ans=lis();
        printf("Case %d: %d\n",kase++,ans);
        /*for(int i=0;i<q+1;i++)
            printf("%d ",b[i]);
        printf("\n");*/
    }
    return 0;
}
<think> 嗯,用户正在询问关于LUT-Only LCs的详细信息。从对话历史来看,用户之前接触过FPGA相关的概念,比如查找表(LUT)和IP核配置,引用内容也涉及Altera(现Intel FPGA)的使用建议和Verilog示例。用户可能是硬件工程师或FPGA学习者,需要深入理解这种特殊逻辑单元的特性。 用户的问题聚焦在"LUT-Only LCs"这个专业术语上,这属于FPGA架构的底层细节。我需要从三个层面解释:基础概念(定义/结构)、与传统LC的区别、应用场景。特别要注意用户提到的引用[1]中"利用正弦波对称性提高内存效率"的线索,这暗示LUT-Only结构对数学函数实现有优势。 技术细节上需要强调:1)LUT-Only省略了寄存器带来的面积优势;2)纯组合逻辑特性;3)资源利用率与布线灵活性的权衡。用户展示的引用[3]的简单门电路代码恰好可以用来说明传统LC的冗余性——当只需要wire连接时,触发器完全浪费了。 考虑到用户可能做资源优化,准备补充一个潜在风险:某些FPGA架构中,LUT-Only单元可能共享配置存储器,过度集中使用可能导致布线冲突。这个点虽然较深,但对实际设计很重要。 相关问题设计成阶梯状:从基础(定义)到应用(时序分析),最后延伸对比其他架构。用户若问到Altera建议(引用[2]),可以展开说明:大型LUT用专用存储器块(如MLAB)比分布式LC更高效,这与LUT-Only的定位不同。 </think> LUT-Only LCs(查找表专用逻辑单元)是FPGA(现场可编程门阵列)架构中的一种特殊逻辑单元类型,专注于高效实现纯组合逻辑功能。其核心特点及与传统逻辑单元(LC)的区别如下: --- ### **LUT-Only LCs 的核心特性** 1. **简化结构** - **仅保留LUT**:省略传统LC中的寄存器(触发器)、进位链和多路复用器等时序/控制部件。 - **纯组合逻辑**:仅支持无记忆功能的组合电路(如布尔运算、数据选择、数学变换),无法实现时序逻辑(如计数器、状态机)。 - 结构示意: ``` 输入信号 → LUT(实现真值表) → 输出信号 ``` 2. **资源与性能优势** - **面积效率**:去除寄存器后,单元物理尺寸显著减小,单位面积内可集成更多逻辑单元。 - **低功耗**:减少时序控制电路,动态功耗降低(适合低功耗场景)。 - **布线灵活性**:简化后的单元更易布局布线,优化关键路径延迟[^1]。 3. **应用场景** - **密集型组合逻辑**:如加密算法(S盒)、数据路径处理(移位/位操作)、数学函数(三角函数、对称性计算[^1])。 - **辅助功能**:作为传统LC的补充,分担纯组合任务,释放带寄存器的LC用于时序逻辑。 --- ### **与传统逻辑单元(LC)的对比** | **特性** | **LUT-Only LC** | **传统LC** | |------------------|-------------------------------|--------------------------------| | **核心组件** | 仅LUT | LUT + 寄存器 + 进位链 + 控制逻辑 | | **逻辑类型** | 纯组合逻辑 | 组合逻辑 + 时序逻辑 | | **面积占用** | 更小(节省~30-50%面积) | 较大 | | **时序支持** | 不支持时钟/寄存器 | 支持同步时序逻辑 | | **适用场景** | 数据流处理、数学运算 | 状态机、计数器、流水线设计 | --- ### **设计考量与限制** 1. **时序约束** - 所有逻辑必须在单周期内完成(无流水线能力),组合路径过长可能限制最大时钟频率。 2. **资源分配策略** - 需与带寄存器的LC协同使用:时序部分用传统LC,密集型计算用LUT-Only LC[^2]。 - 例:在大型LUT设计(如>8位)中,混合使用可优化整体资源利用率[^2]。 3. **厂商实现差异** - **Xilinx**:部分UltraScale+器件支持"LUT-Only Slice"。 - **Intel (Altera)**:Cyclone/Stratix系列通过自适应逻辑模块(ALM)灵活配置LUT模式。 --- ### **应用实例** 1. **对称性计算优化** 在DSP中计算$ \sin/\cos $时,利用LUT-Only LC存储$ [0, \frac{\pi}{2}] $的采样值,通过对称性($ \sin(\pi - \theta) = \sin\theta $)覆盖全周期,减少LUT深度[^1]。 ```verilog // 例:用LUT实现4位对称sin函数 wire [3:0] addr_sym = (phase[2:0] > 3'b100) ? ~phase[2:0] : phase[2:0]; assign sin_value = lut[addr_sym]; // LUT仅存储[0, π/2]范围 ``` 2. **位操作加速** 如CRC校验中的异或链,可通过多级LUT-Only LC并行计算,避免寄存器开销: ```verilog assign crc_out = data_in ^ {crc_reg[30:0], 1'b0} ^ (crc_reg[31] ? 32'h04C11DB7 : 0); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值