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; } };
随性Code