[ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
Generalized Palindromic Number
Time Limit: 2 Seconds Memory Limit: 65536 KB
A number that will be the same when it is written forwards or backwards is known as a palindromic number. For example, 1234321 is a palindromic number.
We call a number generalized palindromic number, if after merging all the consecutive same digits, the resulting number is a palindromic number. For example, 122111 is
a generalized palindromic number. Because after merging, 122111 turns into 121 which is a palindromic number.
Now you are given a positive integer N, please find the largest generalized palindromic number less than N.
Input
There are multiple test cases. The first line of input contains an integer T (about 5000) indicating the number of test cases. For each test case:
There is only one integer N (1 <= N <= 1018).
Output
For each test case, output the largest generalized palindromic number less than N.
Sample Input
4
12
123
1224
1122
Sample Output
11
121
1221
1121
Author: LIN, Xi
Source: The 2014 ACM-ICPC Asia Mudanjiang Regional First Round
解题思路:
题意为给定一个数n。求小于n的最大“回文数”, “回文数”要求连续同样的数能够压缩成一个数,比方1233221,能够压缩成12321,是回文数。
思路为暴力枚举,相当于填数字。首先枚举填左边第一个数字从大到小。然后在里面枚举右边有多少个和它一样的数,注意剪枝,左边当前数字假设符合题意的话,就不用再继续枚举当前数字了。由于要求最大。详细思路在代码凝视中。
參考:http://blog.csdn.net/u011345136/article/details/39122741
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define ll long long
const int maxn=20;
int Left[maxn],Right[maxn];//回文数左部分和右部分,比方 1511 ,左边存1 5 右边存 1 1
string str;//输入字符串
int len;//长度
ll n;//字符串代表的数字 ll lmax(ll a ,ll b)
{
return a>b?a:b;
} ll getNum(int l,int r)//获得当前回文数的值
{
ll ans=0;
for(int i=1;i<=l;i++)
ans=ans*10+Left[i];
for(int i=r;i>=1;i--)//注意存储的顺序,原数的最后一位是Left数组存储的第一位
ans=ans*10+Right[i];
return ans;
} ll dfs(int l,int r,int cur)//左边数字的个数l,右边数字的个数r,当前数字是否是边界。比方2511,第一位2就是边界,回文数该位要<=2。其它位就不是边界,能够从9開始
{
ll ans=-1;
if(l+r-1==len)//由于dfs參数中的l。dfs中给左边第l位赋值。而递归參数为l+1,所以当(l-1+r)=len时才是递归出口
{
ans=getNum(l-1,r);
if(ans>=n) return -1;//别忘了,不能大于等于给定的数 T T
return ans;
}
int now=cur? (str[l-1]-'0'):9;//给左边第l位赋值。推断是否为边界
for(int i=now;i>=0;i--)//枚举第l位
{
Left[l]=i;
//假设 当前l是第一位或者不是第一位但当前位和前一位不一样 且 不能l是第一位且i为0 且 数字还没有填完
if((l==1||(l>1&&Left[l]!=Left[l-1]))&&(!(l==1&&i==0))&&l+r!=len)
{
for(int k=1;l+r+k<=len;k++)//枚举右半部分与第l位同样的有多少位
{
Right[r+k]=i;
ans=lmax(ans,dfs(l+1,r+k,cur&&now==i));
}
}
else
{
ans=lmax(ans,dfs(l+1,r,cur&&now==i));
}
if(ans>0)//假设当前的ans符合题意,就不用再向下搜索了。比方455 第1位4找到一个数符合题意454,那么第一位就不用枚举3 2 1 0了剪枝
return ans;
}
return ans;
} int main()
{
int t;cin>>t;
while(t--)
{
cin>>str;
n=0;
len=str.length();
for(int i=0;i<len;i++)
n=n*10+str[i]-'0';
ll ans=dfs(1,0,1);
cout<<ans<<endl;
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
[ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)的更多相关文章
- ZOJ - 3816 Generalized Palindromic Number dfs
Generalized Palindromic Number Time Limit: 2 Seconds Memory Limi ...
- ACM: FZU 2107 Hua Rong Dao - DFS - 暴力
FZU 2107 Hua Rong Dao Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- ACM: Gym 100935G Board Game - DFS暴力搜索
Board Game Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Gym 100 ...
- hdu 5612 Baby Ming and Matrix games(dfs暴力)
Problem Description These few days, Baby Ming is addicted to playing a matrix game. Given a n∗m matr ...
- PAT 甲级 1019 General Palindromic Number(简单题)
1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...
- 玲珑杯”ACM比赛 Round #4 1054 - String cut 暴力。学到了扫描的另一种思想
http://www.ifrog.cc/acm/problem/1054 问删除一个字符后的最小循环节是多少. 比赛的时候想不出,不知道怎么暴力. 赛后看了别人代码才晓得.唉,还以为自己字符串还不错, ...
- HDU 4770 Lights Against Dudely 暴力枚举+dfs
又一发吐血ac,,,再次明白了用函数(代码重用)和思路清晰的重要性. 11779687 2014-10-02 20:57:53 Accepted 4770 0MS 496K 2976 B G++ cz ...
- Codeforces Beta Round #51 B. Smallest number dfs
B. Smallest number Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/pro ...
- General Palindromic Number (进制)
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
随机推荐
- Atitit. .net c# web 跟clientwinform 的ui控件结构比較
Atitit. .net c# web 跟clientwinform 的ui控件结构比較 .net 4.5 webform Winform 命名空间 System.Web.UI.WebContro ...
- 解决.net的堆碎片化带来的内存占用过大的问题
场景 使用WCF开发的服务端在多个客户端登录后,其服务器的内存占用不断增加. 分析 使用Windbg分析得到内存碎片化严重,其中包含了非常大的空闲空间,最大的一块竟然有150M,真正使用的空间其实很小 ...
- 查看文章strncpy()功能更好的文章
strncpy()功能 原型:extern char *strncpy(char *dest, char *src, int n); 使用方法:#include <string.h> ...
- Ubuntu 设备 spark
周围环境: Unbunt 12.04 Hadoop 2.2.x Sprak 0.9 Scala scala-2.9.0.final.tgz 一步 1. 下载 scala 2. 解压scala,然后改动 ...
- jquery 如何动态绑定传递到后台上传组件参数
$("#upload_photo").uploadify({ 'auto' : false, 'method' : "post", 'height' : 20, ...
- 全文检索引擎Solr 指南
全文检索引擎Solr系列:第一篇:http://t.cn/RP004gl.第二篇:http://t.cn/RPHDjk7 .第三篇:http://t.cn/RPuJt3T
- IOS_多线程_ASI_AFN_UIWebView
H:/0730/00_多线程4票种_ViewController.h // // ViewController.h // 卖票 // // Created by apple on 13-7-29. / ...
- Swift新手教程3-字符串String
原创blog,转载请注明出处 String 在swfit中,String兼容Unicode的方式.用法和C语言类似. 注意 在Cocoa和Cocoa touch中,Swift的String,和Fo ...
- 2048 Puzzle游戏攻略
2048 Puzzle这是目前手机游戏的很火. 在地铁上经常看到的人玩这个游戏. 首先,简介2048 Puzzle游戏. 游戏界面是4X4广场格,每一方格可以放置在数字. 有四种移动数字的方法,向左. ...
- 使用WSE实现Web Service安全----我的第一篇
原文:使用WSE实现Web Service安全----我的第一篇 WSE(Web Services Enhancements)是微软为了使开发者通过.NET创建出更强大,更好用的Web Service ...