SDUT 3648 迷の有序序列 (动态规划) -- 解题报告

原创 2016年08月31日 00:18:17

题面

迷の有序序列
Time Limit: 1000MS Memory Limit: 65536KB

Problem Description
n个数,每次可以选择其中一个数移动到序列任意位置。 至少操作几次能让该序列有序

Input
多组输入,输入到文件结束。 每组输入一个正整数n(0 < n <= 1000) 之后一行输入n个正整数xi(0 < xi < 10^9),表示原始序列

Output
对于每组输入,输出一个整数,表示让序列变为有序所需要的最少操作次数 Hint: 第三组可以选择把1移到2前
也可以把2移动到1后

Example Input
3
1 2 3
3
3 2 1
3
2 1 3

Example Output
0
0
1

Author
LeiQ

所需基础

动态规划 - 最长上升子序列 

解题思路

本题初看可能有些没有头绪,但是仔细想一下的话,由于这道题中元素的移动是任意移动,因此我们只需要把序列中「破坏有序」的这部分元素移动到合适的位置即可,也就是说,其实我们只需求出最长不降子序列和最长不升子序列中的较大值,那么剩下的元素数量就是「破坏有序」的元素的数量,即要交换的元素数量。这样,本题就可以转化为最长不降子序列问题,只需要把最长上升子序列算法中的判定条件加上等于即可。

参考代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int main(int argc, char const *argv[]) {
    int n, a[1000], b[1000], dp1[1000], dp2[1000];
    while(~ scanf("%d", &n)) {
        for(int i=0; i<n; ++i) {
            scanf("%d", &a[i]);
            b[n-1-i] = a[i];
        }
        memset(dp1, 0, sizeof(dp1));
        memset(dp2, 0, sizeof(dp2));
        dp1[0] = dp2[0] = 1;
        // 分别求正序和倒序的最长不降子序列
        for(int i=1; i<n; ++i) {
            int m1 = 0, m2 = 0;
            for(int j=0; j<i; ++j) {
                if(a[j]<=a[i] && m1<dp1[j])
                    m1 = dp1[j];
                if(b[j]<=b[i] && m2<dp2[j])
                    m2 = dp2[j];
            }
            dp1[i] = m1 + 1;
            dp2[i] = m2 + 1;
        }
        int max_len = 0;
        for(int i=0; i<n; ++i) {
            max_len = max(max_len, dp1[i]);
            max_len = max(max_len, dp2[i]);
        }
        printf("%d\n", n-max_len);
    }

    return 0;
}
版权声明:by bLue. 本文为博主原创文章,未经博主允许不得转载。

Pku acm 1338 Ugly Numbers 动态规划解题报告(二十一)

本题要求写出前1500个仅能被2,3,5整除的数。最初的想法是从1开始检验该数是否只能被2,3,5整除,方法是这样的,对于一个数,如果它能被2整除,就除以二,如果它能被3整除,就除以三,如果它能被5整...
  • china8848
  • china8848
  • 2008年04月01日 19:59
  • 3074

二叉查找树、平衡二叉树

树结构练习——排序二叉树的中序遍历 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 在树结构中,有一种特殊的二叉树叫做排序...
  • FEATHER2016
  • FEATHER2016
  • 2017年02月22日 19:53
  • 259

结训总结

2015年寒假集训就在最后的结训比赛中以一道题目惨烈结束了,这个假期,因为前几天有事,所以我比别的队友开始集训要晚几天。还记得开始的时候,我为自己制定了这一个寒假训练的计划,大体分为两方面,一方面是刷...
  • A_Happy_ACMer
  • A_Happy_ACMer
  • 2015年02月09日 22:35
  • 629

山峰的个数

关住 公 纵 号 “  阿蒙课程分享    ”  获得学习资料及趣味分享 描述:十一假期,小P出去爬山,爬山的过程中每隔10米他都会记录当前点的海拔高度(以一个浮点数表示), 这些值序列保存在一个由浮...
  • countofdane
  • countofdane
  • 2017年11月28日 14:38
  • 60

SDUT_3039 迷之好奇 【字典树】

题目链接 题目描述给定n个数字的集合,对于数字x,集合中有多少个数字在x前面添加任意数字可以得到。解题思路首先先将输入的字符逆序,这样就可以转化为前缀的问题。 由测试数据可以看出,当要查询的x为集合...
  • qq_36345036
  • qq_36345036
  • 2017年08月12日 08:44
  • 119

sdutacm-迷之好奇

山东理工acm平台题解
  • axuhongbo
  • axuhongbo
  • 2017年03月07日 00:07
  • 149

sdutacm-迷瘴

山东理工acm平台题解
  • axuhongbo
  • axuhongbo
  • 2017年02月26日 16:46
  • 181

SDUT 小鑫の日常系列故事(七)——小纸条

小鑫の日常系列故事(七)——小纸条 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小鑫在高中的...
  • u013634961
  • u013634961
  • 2014年02月20日 16:33
  • 931

SDUTOJ 2077 迷瘴 贪心

迷瘴 Time Limit: 1000MS Memory limit: 65536K 题目描述  通过悬崖的yifenfei,又面临着幽谷的考验—— 幽谷周围瘴...
  • u013014691
  • u013014691
  • 2015年01月19日 15:03
  • 439

SDUT 迷之好奇

#include #include int top; struct node { int next[26]; int flag; } st[5001000]; int creat(...
  • miao_miao1234
  • miao_miao1234
  • 2015年01月29日 23:30
  • 282
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SDUT 3648 迷の有序序列 (动态规划) -- 解题报告
举报原因:
原因补充:

(最多只允许输入30个字)