Inaka创作音乐。今天的排列包括n个音符***,用排列p_1,p_2,...p_n表示从低到高的音符。
她的朋友Miyako并通过以下两个操作更改***:
Drop-2:取出第二高音符并将其移至最低位置,即将排列更改为pn-1,p1,p2,...,pn-3,pn-2,pn。
反转:取出最低音符并将其移至最高位置,即,将排列更改为p2,p3,…,pn-1,pn,p1。
任意数量的连续Drop-2操作都被视为一个multi-drop。 Miyako希望以最少的multi-drop数目将排列更改为有序排列1,2,…,n。请帮助她找到所需的multi-drop数目。
输入描述:
第一行包含整数n(2≤n≤500),即音符数。
第二行包含n个以空格分隔的整数p1,p2,…,pn,即音符的原始排列。输入保证从1到n(包括1和n)的每个整数在排列中恰好出现一次。
输出描述:输出一个整数,即将排列更改为有序整数所需的多点数目。
将两次操作综合以后可以得出 每一次操作都仅能改变一个数的位置
因为翻转操作不算次数所以就是求n次最长不降子序列
#include<bits/stdc++.h> using namespace std; int a[2000],f[2505]; int lis(int x,int y){//最长不降 int ans=0; memset(f,0,sizeof(f)); for(int i=x;i<=y;++i){ int maxt=0; for(int j=x;j<=i-1;++j){ if(a[i]>a[j]) maxt=max(f[j],maxt); } f[i]=maxt+1; ans=max(f[i],ans); } return ans; } int main (){ int n; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",a+i),a[i+n]=a[i]; int maxt=0; for(int i=1;i<=n;++i){ maxt=max(maxt,lis(i,i+n-1));//跑n次 } printf("%d\n",n-maxt); }