这道题当年我没有做出来,今天微软笔试又碰到了类似的题目

狠心要将这一块吃透

主要还是对动态规划掌握的不够熟练。

去年的题目: 最少射击几次

N个瓶子都有编号,每次能射击1个或多个瓶子,如果是回文的就能一次性击倒。最少几次能全击倒?

测试

输入:[1, 2]

输出:2

输入:[1,3,4,1,5]

输出:3

说明:第一次先射3,变成[1,3,1,5],因为有[1,3,1]回文可以一次击倒,剩下[5]再一次

解题思路:

使用动态规划,我们可以将射击分为一系列子任务,用动态规划熟悉的表格表示,score[ i ] [ j ]表示要击倒 i 到 j 瓶子至少需要几次

那么首先就可以知道score[0 ][0] 、score[1][1]、score[2][2] 、、、都为1(原因很显然,只有一个杯子,当然需要一次)

接下来,就继续扩大范围,看两个两个杯子

接下来是三个 三个

一次递增

我们可以看到 如果  第 j 个杯子 与 第 j + i个杯子相等

那么 score[j][j+i] 就可以等于 scores[j + 1][j + i - 1] ,也就是夹在他们中间的一段(因为动态规划,规模小的已经最优)

但是这里我们还需要考虑scores[j][j + k] + scores[j + k + 1][j + i] 这样的情况(也就是把整段切分为前后两段)

综合以上思路,某位大佬的代码如下:

参考代码:

//
//  main.cpp
//  leetcodeTest
//
//  Created by Qiucheng LIN on 2020/3/25.
//  Copyright © 2020 Qiucheng LIN. All rights reserved.
//#include <vector>
#include <climits>
#include <iostream>
using namespace std;int main() {int N = 8;vector<int> bottles = { 1,2,3,2,9,8,9,1 };vector<vector<int>> scores(N, vector<int>(N));for (int i = 0; i < N; i++){scores[i][i] = 1;}for (int i = 1; i < N; i++) {for (int j = 0; j < N - i; j++) {int min_score = INT_MAX;if (bottles[j] == bottles[j + i]) {min_score = i > 1 ? scores[j + 1][j + i - 1] : 1;}for (int k = 0; k < i; k++) {int temp = scores[j][j + k] + scores[j + k + 1][j + i];if (temp < min_score) {min_score = temp;}}scores[j][j + i] = min_score;}}cout << scores[0][N - 1];return 0;
}

今年的题目:

第二题也是关于回文的

第二题:

给一个字符串,每次可以移除其中一个字符,或者移除一个回文子串,求 全部移除所需最少次数

例如:14315.先移除3,再移除141,再移除5,得到最少次数3.

其实理解一下题意就会发现一模一样。

微软笔试题 回忆(回文方面)相关推荐

  1. 数位DP--由一道微软笔试题引起

    前天晚上,一位研三的学长突然跑到我们宿舍,问我们一道微软笔试题.给你一个整数n,求出1到n这个区间范围内包含数字0的个数,例如当n=10的时候就只有10包含0,输出1,n=90就输出9.唯一的要求是此 ...

  2. 美团2023年春招在线前端笔试题回忆版

    提示:题目不一定完全正确,只能说给大家参考会考察哪些知识点. 文章目录 前言 一.单选(计算机基础知识) 二.专项选择 三.编程题 1. 某地有一个火车站如下图所示,小红很好奇火车是怎么驶进驶出的,然 ...

  3. 试题16 回文数字(5位或6位)

    题目: 观察数字:12321,123321都有一个共同特征,就是无论从左到右读还是从右向左读,都是相同的,叫回文数 现在要从5位或6位的十进制数字中找出各个数位之和等于n的回文数. 输入格式 输入一个 ...

  4. 试题14 回文数(详解)

    题目: 一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数.比如121,2332都是回文数,13,4567度不是回文数. 任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得 ...

  5. ios笔试题算法_微软笔试题-Dijkstra算法

    Dijkstra算法是典型的算法.Dijkstra算法是很有代表性的算法.Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临 ...

  6. CVTE 2017 秋季校招笔试题回忆(C++后台)

    1.概述 2016.09.06 晚参加了 CVTE C++ 岗的在线笔试.笔试题型分为不定向选择题和编程题,总共 27 题.其中不定项选择题为 25 道,编程题 2 道.其特点是不定项选择题不告诉你是 ...

  7. X康java开发工程师笔试题回忆版

    一. 1. String a = "abc"; String b = "abc"; System.out.println(a==b); System.out.p ...

  8. 微软笔试题,机器人消砖块

    我比较傻叉,居然忘了用动态规划做,用了递归,各种边界判断,而且数组稍大一点就栈溢出.递归可以剪支,稍微减少一些递归次数.不管怎么样还是贴上自己的傻叉代码吧 #include<iostream&g ...

  9. 微软笔试题 2013暑期实习笔试题目

    2019独角兽企业重金招聘Python工程师标准>>> 1: 有1000瓶水,其中1瓶是有毒的,小老鼠如果喝了有毒的水会在一个星期后死掉,问至少需要多少只小老鼠来做实验,才能够在一星 ...

  10. 微软笔试题(看到的写答案啊)

    int func(int n, int* r) { printf("n=%d *r=%d\n",n,*r);//加了个打印的东西 return n && (*r + ...

最新文章

  1. python数据结构与算法(11)
  2. 我今天的收获,必备stadio 插件
  3. itextpdf中文不显示_LaTeX实时预览中文
  4. ThinkPHP入门--后盾视频
  5. 注意2018年数据中心的这5大发展趋势
  6. Java 理论与实践: 流行的原子
  7. 大话业务流程图(二)—如何绘制业务流程图?
  8. 编写python代码估算sin(x)的值
  9. k8s Deployment
  10. matlab求解数学题,实验二Matlab求解数学问题
  11. 蜀道难于上青天 四川盆地DEM数据下载
  12. 利用 pdf.js 实现在前端预览 .pdf 文件
  13. 快速给图片加水印的方法
  14. PIC16F15323单片机 (中断与定时器Timer0)
  15. 代码中出现的奇怪问题原因
  16. DDD - 概述 - (一)
  17. Java 输入一个正整数的字符串,输出与它最接近的对称数字(不包括它自己)的字符串
  18. windows 7下工行U盾证书密码框弹不出来--解决方案
  19. 亲完如何进行下一步_相亲完了下一步怎么办 相亲过后怎么发展
  20. C#ObjectArx Cad创建点线块

热门文章

  1. 自定义 Bean 作用域
  2. QT 处理TCP粘包问题
  3. matlab方差 anov,MATLAB单因素方差分析
  4. /etc/fstab文件的详解
  5. html配色插件,【插件技巧】设计师必备配色max插件
  6. Mac连接京瓷打印机Fs-1030MFP/DP
  7. FireFox 插件xpi文件签名2
  8. java文件如何打包_java文件如何打包?
  9. Linux 配置vim
  10. 快速批量创建文件夹的方法