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. 本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

SDUT 3014 硬币问题 (动态规划) -- 解题报告

题面 硬币问题 Time Limit: 1000ms Memory limit: 65536K 题目描述 芳芳有N(1...

SDUT 3554 无尽走廊 (动态规划) -- 解题报告

题面 无尽走廊 Time Limit: 1000MS Memory limit: 65536K 题目描述 2006年,我们可以称之为“帆“船年。一艘艘友谊的小船都在这一年翻掉...

哈理工oj 1116 解题报告 动态规划-依次输出最长公共子序列的位置

新手菜鸟,最近跟着集训队做一些

SDUT 3100 动态规划? (动态规划) -- 解题报告

题面 动态规划? Time Limit: 1000ms Memory limit: 65536K 题目描述 动态规划作为《运筹学》的一个分支,被广泛的用于解决较为复杂的经...

poj经典动态规划题目解题报告

  • 2008年03月23日 19:09
  • 539KB
  • 下载

HDU 5904 LCIS (动态规划) -- 解题报告

题目链接题目大意给定两个序列 a, b,求它们的最长公共子序列,这个子序列必须是值连续递增的,如 3, 4, 5, 6 。解题思路本题给出了一个限制条件,即子序列是值连续递增的序列,无形之中降低了难度...

POJ1088动态规划+递归解题报告

题目链接:摸我看完题目会有一些比较直观的想法,显然是用DP,迭代公式也比较好想,f(i,j) = max{ f(i-1,j), f(i+1,j), f(i,j-1), f(i,j-1) } + 1在上...

Codeforces 429B Working out (动态规划) -- 解题报告

题目链接题目大意两个人在一个有 n×m 个房间的健身房内健身,每个房间都有一个锻炼可消耗的卡路里数。一个人从 a[1][1] 一路锻炼到 a[n][m] ,每次只能从 a[i][j] 移动到 a[i+...

Codevs5288 航线设计(动态规划加强版) 解题报告

【问题描述】        有一个国家被一条河划分为南北两部分,在南岸和北岸总共有N对城镇,每一城镇在对岸都有唯一的友好城镇。任何两个城镇都没有相同的友好城镇。每一对友好城镇都希望有一条航线来往。于是...

石子合并(动态规划)详细解题报告

石子合并(动态规划)详细解题报告 作者:快报    文章来源:本站原创    点击数:9772    更新时间:2005-10-12    一.试题      在一个园形操场的四周摆放N堆石子(N≤1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SDUT 3648 迷の有序序列 (动态规划) -- 解题报告
举报原因:
原因补充:

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