算法笔记_091:蓝桥杯练习 递推求值(Java)
目录
1 问题描述
F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5,
F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3.
初始值为:F(1, 1)=2, F(1, 2)=3, F(2, 1)=1, F(2, 2)=4, F(3, 1)=6, F(3, 2)=5。
输入n,输出F(n, 1)和F(n, 2),由于答案可能很大,你只需要输出答案除以99999999的余数。
21
2 解决方案
本题直接用传统的递推求解,结果会运行超时。
此处要利用要构造矩阵,来计算相应结果。

其具体相关理解,请参考文末参考资料1哦。
本题构造的矩阵如下:
对应1*8的矩阵为[f(3,1),f(3,2),f(2,1),(2,2),f(1,1),f(1,2),3,5]
public final static long[][] UNIT = {{0,1,1,0,0,0,0,0},
{1,0,0,1,0,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,0,1,0,0},
{2,3,0,0,0,0,0,0},
{0,2,0,0,0,0,0,0},
{0,1,0,0,0,0,1,0},
{1,0,0,0,0,0,0,1}}; //根据递推公式构造的矩阵

具体代码如下:
import java.util.Scanner;
public class Main {
public final static long[][] UNIT = {{0,1,1,0,0,0,0,0},
{1,0,0,1,0,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,0,1,0,0},
{2,3,0,0,0,0,0,0},
{0,2,0,0,0,0,0,0},
{0,1,0,0,0,0,1,0},
{1,0,0,0,0,0,0,1}}; //根据递推公式构造的矩阵
public final static long[][] ZERO = new long[8][8]; //元素全为0
public final static long p = 99999999L;
//获取矩阵NUIT的n次方结果
public long[][] getNofMatrix(long n) {
if(n == 0)
return ZERO;
if(n == 1)
return UNIT;
if((n & 1) == 0) { //当n为偶数时
long[][] matrix = getNofMatrix( n >> 1);
return multiOfMatrix(matrix, matrix);
}
//当n为奇数时
long[][] matrix = getNofMatrix((n - 1) >> 1);
return multiOfMatrix(multiOfMatrix(matrix, matrix), UNIT);
}
//计算矩阵A*B取余99999999的值
public long[][] multiOfMatrix(long[][] A, long[][] B) {
long result[][] = new long[A.length][B[0].length];
for(int i = 0;i < A.length;i++) {
for(int j = 0;j < B[0].length;j++) {
for(int k = 0;k < A[0].length;k++)
result[i][j] = (result[i][j] + A[i][k] * B[k][j]) % p;
}
}
return result;
}
public void printResult(long n) {
long[][] start = {{6,5,1,4,2,3,3,5}};
if(n == 1) {
System.out.println(start[0][4]+"\n"+start[0][5]);
return;
} else if(n == 2) {
System.out.println(start[0][2]+"\n"+start[0][3]);
return;
} else if(n == 3) {
System.out.println(start[0][0]+"\n"+start[0][1]);
return;
}
long[][] A = getNofMatrix(n - 3);
start = multiOfMatrix(start, A);
System.out.println(start[0][0]+"\n"+start[0][1]);
return;
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
long n = in.nextLong();
test.printResult(n);
}
}
参考资料:
1.矩阵构造方法
算法笔记_091:蓝桥杯练习 递推求值(Java)的更多相关文章
- 算法笔记_077:蓝桥杯练习 K好数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4, ...
- 算法笔记_061:蓝桥杯练习 字串统计(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然 ...
- 算法笔记_123:蓝桥杯第七届省赛(Java语言B组部分习题)试题解答
目录 1 凑算式 2 方格填数 3 四平方和 1 凑算式 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A ...
- 算法笔记_057:蓝桥杯练习 最大的算式 (Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就 ...
- 算法笔记_086:蓝桥杯练习 9-2 文本加密(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A"转化"B" ...
- 算法笔记_063:蓝桥杯练习 送分啦(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 这题想得分吗?想,请输出“yes”:不想,请输出“no”. 输出格式 输出包括一行,为“yes”或“no”. 2 解决方案 初步一看,这题 ...
- Java实现 蓝桥杯 算法提高 递推求值
算法提高 递推求值 时间限制:1.0s 内存限制:256.0MB 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) ...
- 算法笔记_083:蓝桥杯练习 合并石子(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...
- NYOJ-301递推求值
递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f ...
随机推荐
- XPath语法和CSS选择器介绍
XPath语法 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历.XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 ...
- 【大视野入门OJ】1083:数组的二分查找
Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output ...
- [Codeforces 1053B] Vasya and Good Sequences
Link: Codeforces 1053B 传送门 Solution: 其实就是暴力 观察需要满足的条件: 1.个数和为偶数 2.最大个数不大于其它所有个数的和 如果只有第一个条件记录前缀和的奇偶性 ...
- [xsy3241]暴风士兵
题意:一个血量为$h$的人,它会被攻击$n$次,第$i$次有$p$的概率$-1$滴血(每次的$p$不同),问每次攻击后他的血量期望,强制在线 若一个人被扣了$i$滴血的概率为$p_i$,那么记多项式$ ...
- 【推导】【找规律】【二分】hdu6154 CaoHaha's staff
题意:网格图.给你一个格点多边形的面积,问你最少用多少条边(可以是单位线段或单位对角线),围出这么大的图形. 如果我们得到了用n条边围出的图形的最大面积f(n),那么二分一下就是答案. n为偶数时,显 ...
- 【插头dp】CDOJ1690 这是一道比CCCC简单题难的简单题
最裸的插头dp,可参见大白书. #include<cstdio> #include<cstring> using namespace std; #define MOD 1000 ...
- NNVM代码阅读
op.h #define DMLC_ATTRIBUTE_UNUSED __attribute__((unused)) __attribute__((unused)):通常,如果声明了某个变量,但从未对 ...
- windows和linux下杀死Tomcat进程,解决端口占用
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...
- SpringBoot使用Gradle构建war包
Spring Boot默认将应用打包成可执行的jar包.有时候需要打包成war包部署在tomcat等容器.下面简单介绍下打包的步骤. 一.修改gradle.build文件 1.1 添加如下配置 app ...
- Ubuntu 16.04下使用VMware安装CentOS 6.9然后在里面再安装KVM之后配置网桥无法上网的问题
别试了,这个问题无法解决,已经使用VMware安装了一层虚拟机,然后在里面再安装KVM,网络层次已经变了,即使配置了网桥同样无法上网. 可是这样试一下,不一定成功:把VMware的虚拟机绑定另一张物理 ...