日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Uva11212】 Editing a Book(IDA*)

發布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Uva11212】 Editing a Book(IDA*) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題意】

  有n個數字的全排列,每次可以剪切一段粘貼到某個位置。問最后變成升序最少多少步。

?

如“{2,4,1,5,3,6}要2步

{3,4,5,1,2}只要一步

?

【分析】

  迭代深搜真的AC了也覺得慌= =

  【其實看到這題不應該想到寬搜么???

  全排列只有9!=362880個

  這題的IDA*的估價函數特別機智:

  n<=9,最多2需要8步,深度上限為8。

  考慮后繼不正確的贖回自個數h,可以證明每次剪切時候h最多減少3,因此當3*d+h>3*maxd時可以剪枝。

  【證明上面那個畫一下就知道,一次復制粘貼只有3個東西的后繼被影響。【機智ORZ  ....  

?

1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<cmath> 8 using namespace std; 9 #define Maxn 15 10 11 int a[Maxn][Maxn],v[Maxn]; 12 int maxd,n; 13 bool ok; 14 15 bool ffind(int x,int h) 16 { 17 if(x==maxd) 18 { 19 if(h!=0) return 0; 20 ok=1;return 1; 21 } 22 if(3*x+h>3*maxd) return 0; 23 for(int i=1;i<=n;i++) 24 for(int j=i;j<=n;j++) 25 { 26 for(int k=1;k<i;k++) 27 { 28 for(int l=i;l<=j;l++) a[x+1][k+l-i]=a[x][l]; 29 for(int l=k;l<i;l++) a[x+1][l+j-i+1]=a[x][l]; 30 for(int l=1;l<k;l++) a[x+1][l]=a[x][l]; 31 for(int l=j+1;l<=n;l++) a[x+1][l]=a[x][l]; 32 h=0; 33 for(int l=1;l<n;l++) if(a[x+1][l+1]!=a[x+1][l]+1) h++; 34 35 ffind(x+1,h); 36 if(ok==1) return 1; 37 } 38 for(int k=j+1;k<=n;k++) 39 { 40 for(int l=i;l<=j;l++) a[x+1][k+l-j]=a[x][l]; 41 for(int l=1;l<i;l++) a[x+1][l]=a[x][l]; 42 for(int l=j+1;l<=k;l++) a[x+1][l-j+i-1]=a[x][l]; 43 for(int l=k+1;l<=n;l++) a[x+1][l]=a[x][l]; 44 h=0; 45 for(int l=1;l<n;l++) if(a[x+1][l+1]!=a[x+1][l]+1) h++; 46 ffind(x+1,h); 47 if(ok==1) return 1; 48 } 49 } 50 return 0; 51 } 52 53 int main() 54 { 55 int kase=0; 56 while(1) 57 { 58 ok=0; 59 scanf("%d",&n); 60 if(n==0) break; 61 for(int i=1;i<=n;i++) scanf("%d",&a[0][i]); 62 int h=0; 63 for(int i=1;i<n;i++) if(a[0][i+1]!=a[0][i]+1) h++; 64 printf("Case %d: ",++kase); 65 for(maxd=0;maxd<=n-1;maxd++) 66 { 67 if(ffind(0,h)) {printf("%d",maxd);break;} 68 } 69 printf("\n"); 70 } 71 return 0; 72 } View Code

?

2016-11-15?09:13:56

  

轉載于:https://www.cnblogs.com/Konjakmoyu/p/6064366.html

總結

以上是生活随笔為你收集整理的【Uva11212】 Editing a Book(IDA*)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。