• 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;
         }
    };
    

      

  • 相关阅读:
    《构建之法》读书笔记⑤
    《构建之法》读书笔记④
    个人总结
    构建之法阅读笔记03
    构建之法阅读笔记02
    构建之法阅读笔记01
    第二阶段冲刺——seven
    第二阶段冲刺——six
    第二阶段冲刺——five
    第二阶段冲刺——four
  • 原文地址:https://www.cnblogs.com/forgot93/p/3837586.html
Copyright © 2020-2023  润新知