TimusOJ - 1225.Flags & 1119.Metr & 1009.K-based Numbers (DP简单题)

  • TimusOJ - 1225.Flags
  • TimusOJ - 1119.Metr
  • TimusOJ - 1009.K-based Numbers

TimusOJ - 1225.Flags

题目链接

题目

给你三种颜色,输入n代表的是长方形数,向这些长方形中填充颜色,需要满足下面两个条件:

  • 其中相邻的方块颜色不能相同;
  • 蓝色方块两边必须同时有红色和白色方块;

给你n,问你总共有多少种摆放方案。

解析

记忆化的思路(可结合代码查看):

递归函数的情况(这里用0表示白色, 1表示蓝色, 2表示红色):

  • 递归到当前位置,要判断前一个位置pre和前一个位置的前一个位置prepre的情况;

    • 如果前一个位置是蓝色,则当前位置只能取和prepre相反的颜色(即2 - prepre);
    • 如果前一个位置是红色或者白色,就可以取两种情况,第一种是蓝色,第二种是和pre相反的颜色(红色和白色相反);(但是这里取蓝色的时候要注意不能是最后一个n位置);

import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;public class Main {static long[][] dp;static long recur(int pos, int pre, int prepre, int n){if(pos == n+1)return 1;if(dp[pos][pre] != -1)return dp[pos][pre];int res = 0;if(pre == 1){res += recur(pos+1, 2 - prepre, pre, n);}else { // pre = 0 || pre = 2res += recur(pos+1, 2-pre, pre, n);if(pos != n)res += recur(pos+1, Math.abs(1-pre), pre, n);}return dp[pos][pre] = res;}public static void main(String[] args){Scanner cin = new Scanner(new BufferedInputStream(System.in));int n = cin.nextInt();if(n == 1 || n == 2){System.out.println(2);return;}dp = new long[n+1][3];for(int i = 1; i <= n; i++)Arrays.fill(dp[i], -1);long res = recur(3, 1, 2, n);res += recur(3, 1, 0, n);res += recur(3, 0, 2, n);res += recur(3, 2, 0, n);System.out.println(res);}
}

TimusOJ - 1119.Metr

题目链接

题目

给出N*M网格,其中一些对角点有边相连(给出的是对角点的右上角的点),问从(0,0)(N,M)的最短路径为多长

解析

这种题目和LeetCode-64.Minimum Path Sum和类似。

这题最关键的是 不要将重点放在方块上,而要放在每个顶点上。

递归的想法:

  • 当前位置[i, j](顶点),如果matrix[i+1][j+1] = true,也就是[i, j] ~ [i+1, j+1]有对角边,就选择对角边,然后去递归求最小值;
  • 如果没有对角边,就需要选择走左边和上面的递归函数中选择最小的;
import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;public class Main {static double lenDiag = Math.sqrt(20000); //144static int n, m;static double[][] dp;static double recur(boolean[][] matrix, int i, int j){if(i == n && j == m)return 0;if(dp[i][j] != -1)return dp[i][j];if(i == n)return 100 + recur(matrix, i, j+1);if(j == m)return 100 + recur(matrix, i+1, j);double res = 0;if(matrix[i+1][j+1])res = lenDiag + recur(matrix, i+1, j+1);elseres = 100 + Math.min(recur(matrix, i+1, j), recur(matrix, i, j+1));return dp[i][j] = res;}public static void main(String[] args){Scanner cin = new Scanner(new BufferedInputStream(System.in));m = cin.nextInt();n = cin.nextInt();int k = cin.nextInt();boolean[][] matrix = new boolean[n+1][m+1];for(int i = 0; i < k; i++){int y = cin.nextInt();int x = cin.nextInt();matrix[x][y] = true;}dp = new double[n+1][m+1];for(int i = 0; i <= n; i++)Arrays.fill(dp[i], -1);System.out.println(Math.round(recur(matrix, 0, 0)));}
}

TimusOJ - 1009.K-based Numbers

题目链接

题目

给你n、k,要你求在nk进制数中,有多少个不包含连续两个0的数。

解析

递归的思路:

  • 使用一个boolean变量,记录前一个数是不是0
  • 如果是,当前递归就只能枚举从1 ~ k的数,然后递归;
  • 如果不是,则在上面的基础上,还可以加上0去递归;

因为要记忆化,所以不用boolean变量,dp数组二维只需要两个size大小即可。

import java.io.BufferedInputStream;
import java.util.Scanner;public class Main {static int[][] dp;static int recur(int pos, int isZ, int n, int k){if(pos == n)return 1;if(dp[pos][isZ] != -1)return dp[pos][isZ];int res = 0;for(int i = 1; i < k; i++)res += recur(pos+1, 0, n, k);if(isZ == 0)res += recur(pos+1, 1, n, k);return dp[pos][isZ] = res;}public static void main(String[] args){Scanner cin = new Scanner(new BufferedInputStream(System.in));int n = cin.nextInt();int k = cin.nextInt();dp = new int[n][2];for(int i = 0; i < n; i++){dp[i][0] = -1;dp[i][1] = -1;}System.out.println(recur(0, 1, n, k));}
}

三个题目都是用记忆化写的。递推之后有时间再改吧。。。

TimusOJ - 1225.Flags 1119.Metr 1009.K-based Numbers (DP简单题)相关推荐

  1. ural 1009. K-based Numbers - dp

    1009. K-based Numbers Let's consider K-based numbers, containing exactlyN digits. We define a number ...

  2. 蓝桥杯 K好数(DP)

    算法训练 K好数   时间限制:1.0s   内存限制:256.0MB         问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进 ...

  3. URAL 1225 Flags

    题目:click here 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 cons ...

  4. LeetCode简单题之K 进制表示下的各位数字总和

    题目 给你一个整数 n(10 进制)和一个基数 k ,请你将 n 从 10 进制表示转换为 k 进制表示,计算并返回转换后各位数字的 总和 . 转换后,各位数字应当视作是 10 进制数字,且它们的总和 ...

  5. LeetCode简单题之差的绝对值为 K 的数对数目

    题目 给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k . |x| 的值定义为: 如果 x ...

  6. LeetCode简单题之数组中第 K 个独一无二的字符串

    题目 独一无二的字符串 指的是在一个数组中只出现过 一次 的字符串. 给你一个字符串数组 arr 和一个整数 k ,请你返回 arr 中第 k 个 独一无二的字符串 .如果 少于 k 个独一无二的字符 ...

  7. Leetcode 剑指offer 22. 链表中第k个节点 (每日一题 20210716)

    输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3.4.5.6. ...

  8. SDNU 1429.区间k大数查询(水题)

    Description 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. Input 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. ...

  9. 牛客假日团队赛5 K 金币馅饼 (DP 基础题)

    链接:https://ac.nowcoder.com/acm/contest/984/K 来源:牛客网 金币馅饼 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  10. 【HDU - 2639】Bone Collector II (第K大背包,dp,STLset)

    题干: The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup ...

最新文章

  1. 第二章 数据类型、运算符与表达式
  2. linux kernel devel和kernel source的区别
  3. MybatisPlus学习(四)条件构造器Wrapper方法详解
  4. Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
  5. ode45 matlab 出错,请问,Matlab用ODE45解微分方程,出错
  6. 使用jsonEditor打造一个复杂json编辑器
  7. datetimepicker中文不生效_搜索引擎技术(二十)- elasticsearch - 中文分词器
  8. 计算机术语多态意思,计算机外文翻译测试多态的关系的准则.doc
  9. 热式气体质量流量计检定规程_新品发布:西尼尔ST51/54热式质量流量计
  10. 《纽约时报》畅销书作家发布新的COVID安全旅行提示电子书
  11. 黑苹果(Hackintosh)驱动Intel HD 4600
  12. html里怎么旋转视频文件,如何旋转视频文件(方法三)
  13. 4-tensorflow中张量的数学运算
  14. 网贷7000元要还36万:年轻人,请你赶紧扔掉这四样东西
  15. 微信网址防封防屏蔽,微信域名一直被封怎么办
  16. html导航跳转,css实现导航切换的实例代码
  17. R语言学习笔记1(hist()函数里有关于breaks参数的使用)
  18. 【重磅】个税上调作为程序员更要上班做私单了!
  19. Flink sql填坑记1:Task did not exit gracefully within 180 + seconds
  20. 网众linux安装教程,网众无盘新手篇--LINUX系统U盘安装

热门文章

  1. oracle 关闭归档,Oracle归档的开启和关闭
  2. 电大c语言2017年1月,电大1253+C语言程序设计A(1月)小抄参考
  3. 微信小程序手机摇一摇功能
  4. 这样的国企,不去也罢
  5. Scrapped or attached views may not be recycled. isScrap:false isAttached:true android.support.v7.wid
  6. 数字ic设计自学ing
  7. 作用域链与原型链的区别
  8. 华硕路由虚拟服务器设置方法,华硕路由虚拟服务器设置方法
  9. word电子签名在线制作
  10. 描写计算机教室的词语,关于描写教室的词语