牛牛有一块"2*n"的空白瓷砖并且有足够多的"1*2"和"2*3"两种类型的地毯(地毯可以旋转).现在他想在满足以下条件: 地毯之间不能相互重叠,地毯不能铺出瓷砖外以及不能有空隙下铺满整个瓷砖.问你一共有多少种不同的方案并且结果模上10007输出.
进阶:时间复杂度
,空间复杂度%5C)
第一行输入一个正整数 T .表示有 T 组数据.接下来 T 行,每行输入一个正整数 n.1<= T <= 1001<= n <= 100000
输出 T 行,每一行对应每组数据的输出.
4 1 2 3 5
1 2 4 13
import java.util.Scanner;
public class Main{
public static void main(String[] args){
//已知最大值为100000,则初始化一个长度为100001的数组
int[] dp = new int[100001];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
//计算出所有情况,记得模上10007
for(int i = 4; i < 100001; i++){
dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3])%10007;
}
//获取输入的值
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int nums = scanner.nextInt();
for(int i = 0; i < nums; i++){
System.out.println(dp[scanner.nextInt()]);
}
}
}
} //先接收第一行作为数组长度
const lineNum = parseInt(readline());
let arr = [];
for(let i = 0; i < lineNum; i++){
//readline()这个函数每次调用都会读取下一行输入
let line = readline();
arr.push(Number(line))
}
const niuNiu = (n) => {
const dp = new Array(n).fill(0);
//初始化dp数组。这部分自己画下图就想明白了。分别代表2*1,2*2,2*3时的铺法数量
dp[0] = 1;
dp[1] = 2;
dp[2] = 4;
for(let i = 3; i < n; i++){
dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3]) % 10007;
}
//这里注意不是n
return dp[n - 1];
}
for(let x of arr){
console.log(niuNiu(x));
} /**
* author:刷完这题就去睡觉
* created:
**/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100100;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--){
int n;
cin>>n;
int dp[maxn]={0};
dp[1]=1;
dp[2]=2;
dp[3]=4;
for(int i=4;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
dp[i]%=10007;
}
cout<<dp[n]<<endl;
}
return 0;
} import java.util.Scanner;
public class Main {
static int mod = 10007;
// 列举前五个数字后发现
// 1 --> 1
// 2 --> 2
// 3 --> 4
// 4 --> 1 + 2 + 4 = 7
// 5 --> 2 + 4 + 7 = 13
// 大胆猜想:f(n) = f(n - 1) + f(n - 2) + f(n - 3);
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
int[] dp = new int[100005];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
while (t-- != 0) {
int n = sc.nextInt();
if (dp[n] != 0) {
System.out.println(dp[n]);
continue;
}
for (int i = 4; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
dp[i] %= mod;
}
System.out.println(dp[n]);
}
}
} using System;
using System.Collections.Generic;
namespace text
{
public class Program {
public static void Main() {
// string line;
// while ((line = System.Console.ReadLine ()) != null) { // 注意 while 处理多个 case
// string[] tokens = line.Split();
// System.Console.WriteLine(int.Parse(tokens[0]) + int.Parse(tokens[1]));
// }
int row = int.Parse(System.Console.ReadLine());
List<int> datalist = new List<int>();//原始数据
List<int> ans = new List<int>();//输出
Dictionary<int, int> _dic = new Dictionary<int,int>(); //字典用于减少计算量
_dic.Add(1, 1);
_dic.Add(2, 2);
_dic.Add(3, 4);
int currmax = 3;//当前计算到的最大数
int Mod = 10007;
while(row-- > 0)
{
datalist.Add(int.Parse(System.Console.ReadLine()));
}
for(int i = 0; i < datalist.Count; i++)
{
while(currmax < datalist[i])//如果第i位大于计算过的最大数,则计算最大数到第i位的所有数并存入字典
{
_dic.Add(currmax + 1, ((_dic[currmax] + _dic[currmax - 1] + _dic[currmax - 2]))%Mod);
currmax++;
}
ans.Add(_dic[datalist[i]]);
}
foreach(var a in ans)
{
System.Console.WriteLine(a);
}
}
}
} | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> intmain(){ intT; inta[100]; scanf("%d",&T); for(inti = 0; i<T; i++){ scanf("%d",&a[i]); } intnum[100000]; num[1] = 1; num[2] = 2; num[3] = 4; for(inti=4; i<=100000; i++){ num[i]= num[i-1] + num[i-2] + num[i-3]; num[i] %= 10007; } for(inti=0; i<T; i++){ printf("%d\n",num[a[i]]); } } |
#include<bits/stdc++.h>
using namespace std;
int res[100000];
int main(){
int T;
cin >> T;
res[0] = 1;
res[1] = 2;
res[2] = 4;
for(int i = 3; i < 100000; i++){
res[i] = res[i - 1] + res[i - 2] + res[i - 3];
res[i] %= 10007;
}
for(int i = 0; i < T; i++){
int n;
cin >> n;
cout << res[n - 1] << '\n';
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
int[] temp=new int[T];
for(int i=0;i<T;i++){
temp[i]=sc.nextInt();
}
for(int i=0;i<T;i++){
System.out.println(count(temp[i]));
}
}
public static int count(int a){
if(a==1){return 1;}
if(a==2){return 2;}
if(a==3){return 4;}
int one=1;int two=2;int three=4;int res=0;
for(int i=4;i<a+1;i++){
res=(one+two+three)%10007;
one=two;two=three;three=res;
}
return res;
}
} import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @author tanglei
* @create 2021-08-20 21:49
*/
public class ditan {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] dp = new int[100001];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i < 100001; i++) {
dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3]) % 10007;
}
while (sc.hasNextInt()) {
// int n = sc.nextInt();
int a = sc.nextInt();
int[] b = new int[a];
for (int i = 0; i < a; i++) {
b[i] = sc.nextInt();
System.out.println(dp[b[i]]);
}
}
}
}