• hdu5256 序列变换 dp LIS


    点击打开链接

    思路:

    lis的变形,唯一不同的是条件a[i] - i > a[j] - j + 1,i>j。因为要确保这两个元素之间能插入i - j + 1个元素

    每个数先减去它的下标,防止下面的情况发生:
    加入序列是1,2,2,2,3,这样求上升子序列是3,也就是要修改2个,但是中间的两个2,变化范围又不能超过(1,3)
    那么这样求的也就不对,但是减掉之后,相当于给中间重复的数留下了修改的空间
    解释下为什么可以减而保持正确性:因为题目所求时严格递增,假设是2,3, 4,那么变成1, 1, 1,所以在LIS里非严格递增就可以了
    这也是为什么要在upper_bound的位置插入
    另外:lower_bound返回第一个>=key的位置;upper_bound返回第一个>key的位置,这样相减才是key的个数
    
    
    求严格递增的LIS的方法(非严格递增的LIS只要把lower_bound改成upper_bound)
    1 memset(b,0x3f,sizeof(b));
    2 int mx = -1;
    3 for(int i=1; i<=n; i++){
    4     int pos = lower_bound(b+1,b+1+n,a[i])-b;
    5     b[pos] = a[i];
    6     mx = max(mx,pos);
    7 }
    
    
    代码:
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn = 1e5+10;
     5 
     6 int n,a[maxn],b[maxn];
     7 
     8 // int dp(){
     9 //     int len=1;
    10 //     b[1] = a[1];
    11 //     for(int i=2; i<=n; i++){
    12 //         if(a[i]>=b[len]){
    13 //             len++;
    14 //             b[len] = a[i];
    15 //         }else{
    16 //             int pos = upper_bound(b+1,b+len,a[i])-b;
    17 //             b[pos] = a[i];
    18 //         }
    19 //     }
    20 //     return len;
    21 // }
    22 
    23 int main(){
    24     int T; scanf("%d",&T);
    25     for(int cas=1; cas<=T; cas++){
    26         scanf("%d",&n);
    27         for(int i=1; i<=n; i++){
    28             scanf("%d",&a[i]);
    29             a[i] -= i;
    30         }
    31 
    32         memset(b,0x3f,sizeof(b));
    33         int mx = -1;
    34         for(int i=1; i<=n; i++){
    35             int pos = upper_bound(b+1,b+1+n,a[i])-b;
    36             b[pos] = a[i];
    37             mx = max(mx,pos);
    38         }
    39 
    40         int ans = n-mx;
    41         printf("Case #%d:
    %d
    ",cas,ans);
    42 
    43         // int ans = n-dp();
    44         // printf("Case #%d:
    %d
    ",cas,ans);
    45     }
    46 }
  • 相关阅读:
    Debugging Kafka connect
    android O 蓝牙设备默认名称更改
    qualcomm sdm450 tinymix mic record
    QACT 在线调试 Android O
    Android O seLinux 编译错误
    Android seLinux 设置
    高通 fastboot 显示
    高通 双MIC 设置
    高通 添加 cmdline
    高通 mixer_paths.xml 音频配置文件 初始化过程
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827727.html
Copyright © 2020-2023  润新知