TimusOJ - 1225.Flags 1119.Metr 1009.K-based Numbers (DP简单题)
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
,要你求在n
位k
进制数中,有多少个不包含连续两个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简单题)相关推荐
- ural 1009. K-based Numbers - dp
1009. K-based Numbers Let's consider K-based numbers, containing exactlyN digits. We define a number ...
- 蓝桥杯 K好数(DP)
算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进 ...
- URAL 1225 Flags
题目:click here 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 cons ...
- LeetCode简单题之K 进制表示下的各位数字总和
题目 给你一个整数 n(10 进制)和一个基数 k ,请你将 n 从 10 进制表示转换为 k 进制表示,计算并返回转换后各位数字的 总和 . 转换后,各位数字应当视作是 10 进制数字,且它们的总和 ...
- LeetCode简单题之差的绝对值为 K 的数对数目
题目 给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k . |x| 的值定义为: 如果 x ...
- LeetCode简单题之数组中第 K 个独一无二的字符串
题目 独一无二的字符串 指的是在一个数组中只出现过 一次 的字符串. 给你一个字符串数组 arr 和一个整数 k ,请你返回 arr 中第 k 个 独一无二的字符串 .如果 少于 k 个独一无二的字符 ...
- Leetcode 剑指offer 22. 链表中第k个节点 (每日一题 20210716)
输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3.4.5.6. ...
- SDNU 1429.区间k大数查询(水题)
Description 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. Input 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. ...
- 牛客假日团队赛5 K 金币馅饼 (DP 基础题)
链接:https://ac.nowcoder.com/acm/contest/984/K 来源:牛客网 金币馅饼 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
- 【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 ...
最新文章
- 第二章 数据类型、运算符与表达式
- linux kernel devel和kernel source的区别
- MybatisPlus学习(四)条件构造器Wrapper方法详解
- Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
- ode45 matlab 出错,请问,Matlab用ODE45解微分方程,出错
- 使用jsonEditor打造一个复杂json编辑器
- datetimepicker中文不生效_搜索引擎技术(二十)- elasticsearch - 中文分词器
- 计算机术语多态意思,计算机外文翻译测试多态的关系的准则.doc
- 热式气体质量流量计检定规程_新品发布:西尼尔ST51/54热式质量流量计
- 《纽约时报》畅销书作家发布新的COVID安全旅行提示电子书
- 黑苹果(Hackintosh)驱动Intel HD 4600
- html里怎么旋转视频文件,如何旋转视频文件(方法三)
- 4-tensorflow中张量的数学运算
- 网贷7000元要还36万:年轻人,请你赶紧扔掉这四样东西
- 微信网址防封防屏蔽,微信域名一直被封怎么办
- html导航跳转,css实现导航切换的实例代码
- R语言学习笔记1(hist()函数里有关于breaks参数的使用)
- 【重磅】个税上调作为程序员更要上班做私单了!
- Flink sql填坑记1:Task did not exit gracefully within 180 + seconds
- 网众linux安装教程,网众无盘新手篇--LINUX系统U盘安装
热门文章
- oracle 关闭归档,Oracle归档的开启和关闭
- 电大c语言2017年1月,电大1253+C语言程序设计A(1月)小抄参考
- 微信小程序手机摇一摇功能
- 这样的国企,不去也罢
- Scrapped or attached views may not be recycled. isScrap:false isAttached:true android.support.v7.wid
- 数字ic设计自学ing
- 作用域链与原型链的区别
- 华硕路由虚拟服务器设置方法,华硕路由虚拟服务器设置方法
- word电子签名在线制作
- 描写计算机教室的词语,关于描写教室的词语