POJ2718 递归套递归
就是给你一个数,排列组合,然后问如何排列之间的差值最小。
我之前的想法是一个递归,然后两个for循环枚举L1和L2,结果TLE了,然后想了一下剪枝发现没办法剪,然后看了一下别人的代码,用了next_permutation函数,虽然表示在书上看到过,但是具体确实没有用过,看到别人用了,虽然我也想用一下,但是还是觉得走正道吧,比较递归才是正道。不过这道题目,用了这个函数跑的比我的要快,6666
当然我也思考过我第一个为什么会T,原因就是我的排列是10个A的无序排列相乘,但是那种种还加了双重循环,所以T了。然后这里的话就是单纯的枚举一种,然后第二种就定了,所以只有排列组合的相乘。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath> using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = ;
int a[maxn];
bool vis[maxn];
int cnt;
int mini; void minidfs(int l2, int tmp, int val2, int val1){
if (l2 == ){
int t = abs(val2 - val1);
mini = min(mini, t);
return ;
}
for (int i = ; i <= cnt; i++){
if (vis[i]) continue;
if (val2 == && a[i] == && l2 != ) continue;
vis[i] = true;
minidfs(l2 - , tmp / , val2 + tmp * a[i], val1);
vis[i] = false;
}
} void dfs(int l1, int tmp, int val1){
if (l1 == ){
int t = ;
int l2 = (cnt + ) / ;
for (int i = ; i < l2; i++) t *= ;
//printf("%d\n", l2);
minidfs(l2, t, , val1);
return ;
}
for (int i = ; i <= cnt; i++){
if (a[i] == && val1 == && l1 != ) continue;
if (vis[i])continue;
vis[i] = true;
dfs(l1 - , tmp / , val1 + a[i] * tmp);
vis[i] = false;
}
} int main(){
int t; cin >> t;
getchar();
while (t--){
memset(vis, false, sizeof(vis));
memset(a, , sizeof(a));
cnt = ;
mini = inf;
char ch = '';
while (ch != '\n'){
scanf("%c", &ch);
if (ch >= '' && ch <= '') a[++cnt] = ch - '';
}
int tmp = ;
for (int i = ; i < cnt / ; i++) tmp *= ;
//printf("%d\n", tmp);
dfs(cnt / , tmp, );
printf("%d\n", mini);
}
return ;
}
POJ2718 递归套递归的更多相关文章
- Reverse Linked List 递归非递归实现
单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...
- Java基础知识强化之IO流笔记12:递归之递归解决问题的思想(图解)
1. 使用递归计算5!的结果,递归思想的本质如下: 2. 下面就要使用代码实现这个递归: 递归实现分析: (1)做递归要写一个方法 (2)出口条件 (3)规律 代码实现如下: package com. ...
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现【可运行】
C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现[可运行] #include <stdio.h> #include <stdlib.h> typedef int Key ...
- [速记]关于指针,引用和递归和解递归——C++
在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- Unity3D学习笔记——递归+非递归遍历GameObject的子物体
在Unity3D中没有提供直接的方法获取某个GameObject的子GameObject,但是所有的GameObject都有transform对象,所以,一般是通过获取子GameObject的tran ...
- Java基础知识强化之IO流笔记11:递归之递归概述和注意事项
1. 递归: 方法定义中调用方法本身的现象. e.g: public void show(int n ) { if(n <= 0) { System.exit(0); } System.out. ...
- recursion 递归以及递归的缺点
递归定义的算法有两部分: 递归基:直接定义最简单情况下的函数值: 递归步:通过较为简单情况下的函数值定义一般情况下的函数值. 应用条件与准则: (1)问题具有某种可借用的类同自身的子问题描述的性质: ...
随机推荐
- opencv轮廓处理函数详细
ApproxChains 用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage, int me ...
- LR错误整理
1.LoadRunner超时错误: 在录制Web服务器端,如果超过120秒服务器协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同. 错误现象1:Action.c(16): Er ...
- iosUIScrollView以及UIPageControl的基本使用以及所有代理方法
//创建ScrollView的方法 -(void)createScrollView { UIScrollView *sv = [[UIScrollView alloc]initWithFrame:CG ...
- VirtualBox中安装CentOS(新手教程)
1.VirtualBox下载 官网:http://www.virtualbox.org/wiki/Downloads 下载好之后,一路下一步安装即可 2.CentOS下载 官网:https://www ...
- Windows线程同步(上)
先介绍一个创建线程的API,参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx ...
- 理解 php 中& 引用
php中引用&的真正理解-变量引用.函数引用.对象引用 php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没 ...
- Eclipse配置--智能补全
定位到:Windows→Preferences→Java→Editor→Content Assist 将Auto Activation triggers for java的默认值“.”修改为" ...
- Struts2(result 流 )下载
jsp: <body> <a href="stream.action?fileName=psb.jpg">psb</a> <br> ...
- SSH登录很慢问题的解决方法
用ssh连其他linux机器,会等待10-30秒才有提示输入密码.严重影响工作效率. 关闭ssh的gssapi认证 用ssh -v user@server 可以看到登录时有如下信息: debug1: ...
- MySQL数据表中内容大小写区分的设置
MYSQL在默认的情况下查询是不区分大小写的,例如: ? 1 2 3 4 5 6 7 mysql> create table t1( -> name varchar(10)); Qu ...