bzoj 5449: 序列
Posted hehe54321
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 5449: 序列相关的知识,希望对你有一定的参考价值。
https://www.lydsy.com/JudgeOnline/problem.php?id=5449
话说很早以前做过。。算是IDA*的板子吧,一个简单的估价函数就可以过去了
1 %:pragma GCC optimize(2) 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int a[50],n,maxd,T; 6 bool fl; 7 inline bool check() 8 { 9 for(int i=1;i<n;++i) 10 if(a[i]>a[i+1]) 11 return 0; 12 return 1; 13 } 14 //reverse一次,相邻两数绝对值之差大于1的最多减少1个, 15 //因此相邻两数绝对值之差大于1的个数一定小于等于所需reverse次数 16 inline int hh() 17 { 18 int cnt=0; 19 for(int i=1;i<n;++i) 20 if(abs(a[i+1]-a[i])>1) 21 cnt++; 22 return cnt; 23 } 24 inline void reverse1(const int& r) 25 { 26 int i,t; 27 for(i=1;i<=r/2;++i) 28 { 29 t=a[i];a[i]=a[r-i+1];a[r-i+1]=t; 30 } 31 } 32 void dfs(int x,int last) 33 { 34 if(fl) return; 35 if(x==maxd) 36 { 37 if(check()) fl=1; 38 return; 39 } 40 if(x+hh()>maxd) return; 41 for(int i=2;i<=n;++i) 42 if(i!=last) 43 { 44 reverse(a+1,a+i+1); 45 dfs(x+1,i); 46 reverse(a+1,a+i+1); 47 } 48 } 49 int main() 50 { 51 int i; 52 scanf("%d",&T); 53 while(T--) 54 { 55 fl=0; 56 scanf("%d",&n); 57 for(i=1;i<=n;++i) 58 scanf("%d",&a[i]); 59 for(maxd=0;maxd<=30;++maxd) 60 { 61 dfs(0,0); 62 if(fl) break; 63 } 64 printf("%d ",maxd); 65 } 66 return 0; 67 }
此题http://210.33.19.103/contest/823/problem/2(序列)同以上题
以上是关于bzoj 5449: 序列的主要内容,如果未能解决你的问题,请参考以下文章