UVA-11212 Editing a Book (IDA*)
2016-06-30 19:21
561 查看
题目大意:将一个数字序列以最少的剪切次数粘贴成另一个数字序列。
启发函数是3d+h>3maxd(d为当前操作步骤数,h为当前逆序对数,maxd为当前枚举的最大步骤数)
可见迭代递归的核心思想是枚举ans去判断dfs是否可行,相反常规搜索是dfs去需找ans。
总结:本题使用 IDA* 算法求解枚举答案去判断是否可行,并不断操作执行,最后得到正确答案
;
启发函数是3d+h>3maxd(d为当前操作步骤数,h为当前逆序对数,maxd为当前枚举的最大步骤数)
可见迭代递归的核心思想是枚举ans去判断dfs是否可行,相反常规搜索是dfs去需找ans。
总结:本题使用 IDA* 算法求解枚举答案去判断是否可行,并不断操作执行,最后得到正确答案
#include<cstdio> #include<cstring> const int maxn=9; int n,a[maxn]; //判断目前数列是否满足要求; bool result(){ for(int i=0;i<n-1;i++) if(a[i] >= a[i+1]) return false; return true; } //判断不符合的个数; int last(){ int sum=0; for(int j=0;j<n-1;j++) if(a[j]+1!=a[j+1])sum++; if(a[n-1]!=n) sum++; return sum; } bool dfs(int d,int maxn1){ if(d*3+last() > maxn1*3)return false;//如果不满足元素大于目前操作步数所能调整的最大元素个数,则退出,步数加一步; if(result()) return true;//如果当前数列满足条件,则返回真; int b[maxn],old[maxn];//数组old[maxn]用于保存原有数组; memcpy(old,a,sizeof(a)); for(int i=0;i<n;i++) for(int j=i;j<n;j++){//枚举剪切的开头(i)和末尾(j); int cnt=0; for(int k=0;k<n;k++) if(k<i||k>j)b[cnt++]=a[k]; for(int k = 0; k <= cnt; k++) { int cnt2 = 0; //把剪切后的数组调整到数组a[maxn]中; for(int p = 0; p < k; p++) a[cnt2++] = b[p]; for(int p = i; p <= j; p++) a[cnt2++] = old[p]; for(int p = k; p < cnt; p++) a[cnt2++] = b[p]; if(dfs(d+1, maxn1)) return true;//继续操作; memcpy(a, old, sizeof(a));//为下次执行清空数组; } } return false; } int search1(){ if(result())return 0; int ans=5; for(int ll=1;ll<ans;ll++)//循环枚举答案; if(dfs(0,ll))return ll; return ans; } int main(){ int kase=0; while(scanf("%d",&n)==1&&n){ for(int i=0;i<n;i++) scanf("%d",&a[i]); printf("Case %d: %d\n",++kase, search1()); } return 0; }
;
相关文章推荐
- Hello Mr.J——WebService传递Map类型
- 妹子好不好,只看一个地方!
- list-style
- python之根据数值打印对应数目*号
- DNS工作原理-----简述
- 侧滑
- Linux /proc/stat结点cpu信息含义简述
- hdu 4983(欧拉函数)
- 常用 Git 命令清单
- Flex远程访问获取数据--HTTPService
- tableView滚动到底部
- Mysql索引与键
- RecyclerView的使用_android
- python2.7读写xls
- Python学习笔记(三): 收集参数
- js面试程序题及详解
- 添加图片水印 PHP实现
- hdu 3589(二次剩余+雅可比符号)
- cmd命令启动tomcat
- OpenCV与EmguCV中的漫水填充