564 Find the Closest Palindrome:给出一个长度不超过18的非负整数,求出与其最近接的回文整数(不包括它自己)。

思路:假设其长度为偶数。将其分为两半,前一半设为$x$,那么最后的答案的前一部分一定是$x-1,x,x+1$三个中的一个。在这里,$x-1$有可能变成少一位的数字,比如100到99; $x+1$可能多一位,比如99到100.长度为奇数时类似的思路。

long long strToInt(string s) {long long t=0;for(int i=0;i<(int)s.size();++i) {t=t*10+s[i]-'0';}return t;
}string intToString(long long x) {if(x==0) return "0";stack<int> st;while(x) {st.push(x%10);x/=10;}string s="";while(!st.empty()) {s+='0'+st.top();st.pop();}return s;
}void up(long long &x,long long p,long long q) {if(p==q) return;if(x==-1) {x=p;}else if(abs(p-q)<abs(x-q)) {x=p;}
}string revStr(string s) {int ll=0,rr=(int)s.size()-1;while(ll<rr) {swap(s[ll++],s[rr--]);}return s;
}class Solution {
public:string nearestPalindromic(string s) {long long x=strToInt(s);int n=(int)s.size();if(s.size()==1) {if(s=="0") return "1";return intToString(x-1);}long long ans=-1;if(n&1) {long long t0=strToInt(s.substr(0,n/2+1));for(int i=-1;i<=1;++i) {string s1=intToString(t0+i);string s2=s1;revStr(s1.substr(0,s1.size()-(s1.size()==n/2+1)));if(s1.size()<n/2+1) {s2+=s1;}else if(s1.size()==n/2+1) {s2+=revStr(s1.substr(0,n/2));}else {s2+=revStr(s1.substr(0,s1.size()-2));}long long k=strToInt(s2);up(ans,k,x);}}else {long long t0=strToInt(s.substr(0,n>>1));if(t0==1) {up(ans,9,x);up(ans,11,x);up(ans,22,x);return intToString(ans);}for(int i=-1;i<=1;++i) {string s1=intToString(t0+i);string s2=s1;if(s1.size()<n/2) {s2+=revStr(s1+"9");}else if(s1.size()==n/2) {s2+=revStr(s1);}else {s2+=revStr(s1.substr(0,n/2));}long long k=strToInt(s2);up(ans,k,x);}}return intToString(ans);}
};

546 Remove Boxes:给定一个长度不超过100的整数数列。每次可以删除连续的相同的一段(删除后两端的会连接到一起)。设该次删除的数字的个数为$k$,那么将得到$k*k$个分数。选择一种删除的序列,使得删除完所有数字后得到的分数最多?

思路:对于某一段连续的数字,可以将其单独删除,或者是跟其他的连在一起的时候再删除。设$f[L][R][k]$表示现在删除$[L,R]$之间的所有数字,且$R$位置之后有$k$个数字跟$R$位置上的数字相同.如果单独删除$R$以及后面的数字,有分数$f[L][R-1][0]+(1+k)^{2}$;否则可以选择跟之前的某一段合并,设合并的位置为$t$,那么有$f[L][t][k+1]+f[t+1][R-1][0]$。

实际实现的时候可以将连续相同的进行合并,速度会快一些。

vector<pair<int,int>> all;
int f[111][111][111];int dfs(int L,int R,int k) {if(L>R) return 0;if(f[L][R][k]!=-1) return f[L][R][k];if(L==R) return (k+all[L].second)*(k+all[L].second);int &ans=f[L][R][k];ans=dfs(L,R-1,0)+(k+all[R].second)*(k+all[R].second);for(int i=R-1;i>=L;--i) {if(all[i].first==all[R].first) {int tmp=dfs(L,i,all[R].second+k)+dfs(i+1,R-1,0);ans=max(ans,tmp);}}return ans;
}class Solution {
public:int removeBoxes(vector<int>& a) {all.clear();int n=(int)a.size();if(n==0) return 0;all.push_back(make_pair(a[0],1));for(int i=1;i<n;++i) {if(a[i]==all.back().first) {++all.back().second;}else {all.push_back(make_pair(a[i],1));}}memset(f,-1,sizeof(f));return dfs(0,(int)all.size()-1,0);}
};

  

leetcode 564,546相关推荐

  1. 【细节实现 回文串12】LeetCode 564. Find the Closest Palindrome

    LeetCode 564. Find the Closest Palindrome 本博客转载自:http://www.cnblogs.com/grandyang/p/6915355.html Sol ...

  2. LeetCode第 546 题:移除盒子(C++) (弃)

    546. 移除盒子 - 力扣(LeetCode) 典型的动态规划最大值问题,单次移除的盒子个数(k)越多,得到的积分 k*k 就会越大,所以每次操作肯定会把连续的相同颜色的盒子都去掉. 注意: 这题还 ...

  3. Java实现 LeetCode 564 寻找最近的回文数(今天要GG在这道题了 头晕+题难(((φ(◎ロ◎;)φ))))...

    564. 寻找最近的回文数 给定一个整数 n ,你需要找到与它最近的回文数(不包括自身). "最近的"定义为两个整数差的绝对值最小. 示例 1: 输入: "123&quo ...

  4. [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]

    [问题描述][困难] [解答思路] 1. 递归 动态规划 class Solution {public int removeBoxes(int[] boxes) {int[][][] dp = new ...

  5. leetcode(546)消消乐(动态规划)

    题目:给你一组方块:每一种数字都代表一种颜色,你该采取怎样的消去策略,能确保自己的得分最高呢?(我们假设每次消去n个方块,就可以得到n的平方这么多的分数) 例: 输入:1,3,2,2,2,3,4,3, ...

  6. leetcode零散题汇总

    零散题 golang力扣leetcode 15.三数之和 golang力扣leetcode 128. 最长连续序列 golang力扣leetcode 1345.跳跃游戏IV golang力扣leetc ...

  7. 华北理工大学迁安学院计算机专业分数线,华北理工大学2018年各专业录取分数线...

    华北理工大学2018年各专业录取分数线 来源:华北理工大学 发布时间:2019-06-17 17:09:22 整理:一品高考网 华北理工大学2018年各专业录取分数线 河北本科一批文史类专业分数 专业 ...

  8. leetcode 546. 移除盒子 —— 动态规划

    将上面记忆化存储的递归算法,改为递推算法.即动态规划法. 546. 移除盒子 题目: 546. 移除盒子 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色. 你将经过若干轮操作 ...

  9. leetcode 546. Remove Boxes

    Solution 讲解: leetcode 546. Remove Boxes 很巧妙的分析思路:T(i, j, k) 来表示 k个相同前缀,i-j 之间的最大值 自己写的 自底向上的  Bottom ...

最新文章

  1. 硬件加速器为人工智能应用服务
  2. 338. Counting Bits
  3. mysql 使用不同引擎_mysql 不同引擎的比较
  4. java 文件提前结束_java – org.xml.sax.SAXParseException:过早结束文件
  5. Colored Boots
  6. Micropython教程之TPYBoard制作蓝牙+红外循迹小车
  7. html为什么要进行表单验证_化学锚栓为什么要进行拉拔试验?
  8. “嘿,我们又见面了!”
  9. 通用的日志处理类(分享)
  10. CentOS7安装VirtualBox
  11. c# 封装“度分秒”与弧度之间的转换 以及datagridview控件的应用
  12. 《Android Studio开发实战 从零基础到App上线(第2版)》出版后记
  13. 关于JavaScript中变量的相互引用
  14. JQuery Tables 的应用(二)
  15. python java 速度_Java Go python 运行速度对比
  16. python opencv人脸识别考勤系统
  17. w3school和w3cschool两个网站有什么关系和区别?
  18. 百度网盘资源下载快速提速方法,无需破解
  19. 梅西 (Lionel Messi)
  20. 14年和15年的IT公司排行

热门文章

  1. python中xpath_Python爬虫之Xpath语法
  2. crontab 每5分钟_Crontab安装步骤和命令使用详细解说
  3. 最完整的Win7快捷键
  4. 如何在android的XML和java代码中引用字符串常量
  5. access工具_工具篇之pycharm小技巧-httpclient
  6. oracle查看数据库剩余空间,Oracle 查看数据库空间使用情况
  7. html5引入外联样式的优先级,CSS的4种引入方式及优先级
  8. 编写java程序的三步骤_帮助Java小白涨知识的教程(三)(运行HelloWorld程序)
  9. php面试带项目_PHP面试常用算法(推荐)
  10. java 字母大写_Java字母大小写转换的方法