Topcoder Srm627 DIV 2

A,B:很水,注意边界,话说HACK都是这些原因。

C:

 R[I][J]:表示反转I-J能改变冒泡排序的次数;

   DP方程:dp[i][k]=max(dp[j][k],dp[j][k-1]+dp[j][i])  (0<=j<i) 

              最后枚举,具体看代码

#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<string.h>

using namespace  std;
class BubbleSortWithReversals{
public:
     int bs(vector<int> a)
     {
        int n=a.size(),ans=0;

        while (n--){
            for (int i=0;i<a.size()-1;i++)
            if (a[i]>a[i+1]) 
            {
               swap(a[i],a[i+1]);
               ans++;    
            }
         }
         return ans;
     }
     
     int getMinSwaps(vector<int> A,int K){
        int n=A.size();
        int dp[55][55]={0};
        int r[55][55]={0};
        
        for (int i=0;i<n;i++)
            for (int j=i+1;j<n;j++){
            r[i][j]=bs(A);
            reverse(A.begin()+i,A.begin()+j+1);
            r[i][j]-=bs(A);
            reverse(A.begin()+i,A.begin()+j+1);
          }
        
         for (int i=0;i<n;i++){
            for (int k=1;k<=K;k++)
                for (int j=0;j<i;j++)
                {
                dp[i][k]=max(dp[i][k],dp[j][k]);
                dp[i][k]=max(dp[i][k],dp[j][k-1]+r[j][i]);
            }
         }
        
         int ans=0;
         for (int i=0;i<=K;i++)
         ans=max(ans,dp[n-1][i]);
         return bs(A)-ans;
     }
};

  

原文地址:https://www.cnblogs.com/forgot93/p/3837586.html