传送门

题目

There are 2N balls, N white and N black, arranged in a row. The integers from 1 through N are written on the white balls, one on each ball, and they are also written on the black balls, one on each ball. The integer written on the i-th ball from the left (1 i 2N) is ai, and the color of this ball is represented by a letter ci. ci = W represents the ball is white; ci = B represents the ball is black.

Takahashi the human wants to achieve the following objective:

  • For every pair of integers (i,j) such that 1 i < j N, the white ball with i written on it is to the left of the white ball with j written on it.
  • For every pair of integers (i,j) such that 1 i < j N, the black ball with i written on it is to the left of the black ball with j written on it.

In order to achieve this, he can perform the following operation:

  • Swap two adjacent balls.

Find the minimum number of operations required to achieve the objective.

Constraints

  • 1 N 2000
  • 1 ai N
  • ci = W or ci = B.
  • If i j, (ai,ci) (aj,cj)

Input

Input is given from Standard Input in the following format:

N
c1 a1
c2 a2
:
c2N a2N

Output

Print the minimum number of operations required to achieve the objective.

题目大意

给出一个黑棋N个白棋N个的排列,每一种颜色的球分别标上1 - N,每次可以交换相邻两个球,求白棋相对顺序正确并且黑棋相对顺序正确,所需要最少的步数

分析

设dpij为排好白球前i个和黑球前j个所需最小步数,用a和b数组分别记录黑白球的每一数值所在位置,用c1和c2分别记录将黑白球某一数值x移到此颜色的x-1数值之后所需步数(这里的步数既有同色数目又有异色数目)。所以我们不难想出dpij由dpi-1j和dpij-1转移而来,因此得到方程式dp[i][j]=min(dp[i-1][j]+c1[i][j],dp[i][j-1]+c2[i][j])。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int dp[2100][2100],a[2100],b[2100],c1[2100][2100],c2[2100][2100];
int main(){
      int n,m,i,j,k,x;
      char ch;
      cin>>n;
      for(i=1;i<=2*n;i++){
           cin>>ch>>x;
           if(ch=='B'){
               a[x]=i;
           }else {
               b[x]=i;
           }
      }
      for(i=1;i<=n;i++){
           for(j=1;j<i;j++)
              if(a[i]<a[j])c1[i][0]++;
           for(j=1;j<=n;j++){
               c1[i][j]=c1[i][j-1];
               if(b[j]>a[i])c1[i][j]++;
           }
      }
      //c用于记录要向后走几步
      for(i=1;i<=n;i++){
           for(j=1;j<i;j++)
              if(b[i]<b[j])c2[0][i]++;
           for(j=1;j<=n;j++){
               c2[j][i]=c2[j-1][i];
               if(a[j]>b[i])c2[j][i]++;
           }
      }
      int wh1=0,wh2=0;
      for(i=1;i<=n;i++){
           wh1+=c1[i][0];
           wh2+=c2[0][i];
           dp[i][0]=wh1;
           dp[0][i]=wh2;
      }
      for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
            dp[i][j]=min(dp[i-1][j]+c1[i][j],dp[i][j-1]+c2[i][j]);
      cout<<dp[n][n]<<endl;
      return 0;
}

ARC097E Sorted and Sorted的更多相关文章

  1. arc 097 E - Sorted and Sorted

    E - Sorted and Sorted Time limit : 2sec / Memory limit : 1024MB Score : 600 points Problem Statement ...

  2. python中sorted和.sorted 、reversed和reverse的注意点

    L=[1,2,3,4]l1=[123,123,23]if l1.sort() == L.reverse():   #这个判断式是恒等的,因为两个函数的返回值都是None(其实是无返回值)    pri ...

  3. python中sorted和sorted 、reversed和reverse的使用。

    #encoding = utf-8 list = [1,8,3,6] print(list.sort()) #None print(list) #[1,3,6,8] print(sorted(list ...

  4. AtCoder ARC097C Sorted and Sorted:dp

    传送门 题意 有 $ 2n $ 个球排成一行,其中恰好有 $ n $ 个白球和 $ n $ 个黑球.每个球上写着数字,其中白球上的数字的并集为 $ \lbrace 1 \dots n\rbrace $ ...

  5. python 中 sorted() 和 list.sort() 的用法

    今天用python自带的sorted对一个列表进行排序, 在这里总结一下 只要是可迭代对象都可以用sorted . sorted(itrearble, cmp=None, key=None, reve ...

  6. python 排序sorted

    num = [3,2,4,6,5] anum = sorted(num) dnum = sorted(num,reverse=True) print '升序:',anum # 升序: [2, 3, 4 ...

  7. Redis in .NET Core 入门:(5) Sorted SET

    第1篇:https://www.cnblogs.com/cgzl/p/10294175.html 第2篇 String:https://www.cnblogs.com/cgzl/p/10297565. ...

  8. Redis实战 - 2.list、set和Sorted Set

    List Redis的List是通过Linked List(链表)来实现的String集合,所以插入数据的速度很快. 但是缺点就是在数据量比较大的时候,访问某个数据的时间可能会很长,但针对这种情况,可 ...

  9. [Swift]LeetCode768. 最多能完成排序的块 II | Max Chunks To Make Sorted II

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

随机推荐

  1. 奥森图标和CSS特殊字体使用方法

    作为第一篇博文,写这个 我快要被气炸,好吧,废话不说了 昨天在项目中发现有很多这些Awesome图标 也在网上找了下Font Awesome下载后这些文件,现在的版本是4.2,Font Awesome ...

  2. 一个例子看懂所有nodejs的官方网络demo

    今天看群里有人用AI技术写了个五子棋,正好用的socket.io,本身我自己很久没看nodejs了,再加上Tcp/IP的知识一直很弱,我就去官网看了下net.socket 发现之前以为懂的一个官方例子 ...

  3. Oracle创建函数

    --创建函数语法 create [or replace] function [schema.]function_name (函数参数列表) --参数有IN.OUT.IN OUT三种类型:IN代表需要输 ...

  4. php一维数组的创建

    php一维数组的创建 (1)通过array函数声明数组 使用array 函数定义数组,该函数返回通过所接受接收的参数建立的数组.array 函数使用的格式如下. $arry_name = array( ...

  5. 应验log4j.xml时不能找到log4j.dtd

    原因分析:log4j.xml中使用log4j的DTD验证其格式的有效性"<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd&quo ...

  6. 分享知识-快乐自己:mybatis 主键回调

    以下两种方式实现 主键回掉方式. <!--添加用户信息:主键回调--> <insert id="insertUser" useGeneratedKeys=&quo ...

  7. GeoServer基础教程(四):空间数据互操作的接口规范WMS、WFS和WCS

    转载:https://ethanblog.com/tech/all-about-wms-wfs-and-wcs.html 前面几节介绍了GeoServer基础教程的一些基本操作,相信大家对GeoSer ...

  8. codeforces 622C C. Not Equal on a Segment

    C. Not Equal on a Segment time limit per test 1 second memory limit per test 256 megabytes input sta ...

  9. linux命令学习笔记(41):ps命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前 那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程 ...

  10. 如何查看myeclipse是否激活

    myEclipse---->Subscription information--->Subscription expiration date 看这个日期到什么时候!另外建议别用太高版本的M ...