Java实现蓝桥杯模拟正整数序列的数量

问题描述
  小明想知道,满足以下条件的正整数序列的数量:
  1. 第一项为 n;
  2. 第二项不超过 n;
  3. 从第三项开始,每一项小于前两项的差的绝对值。
  请计算,对于给定的 n,有多少种满足条件的序列。
输入格式
  输入一行包含一个整数 n。
输出格式
  输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
样例输入
4
样例输出
7
样例说明
  以下是满足条件的序列:
  4 1
  4 1 1
  4 1 2
  4 2
  4 2 1
  4 3
  4 4
评测用例规模与约定
  对于 20% 的评测用例,1 <= n <= 5;
  对于 50% 的评测用例,1 <= n <= 10;
  对于 80% 的评测用例,1 <= n <= 100;
  对于所有评测用例,1 <= n <= 1000。

 

package 第十三次模拟;

import java.util.Scanner;

public class Demo8序列 {
	public static int n=0,count=0;
	public static int [] []map ;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		 n =sc.nextInt();
		 sc.close();
		 map = new int [n+1][n+1];
		 for (int i = 1; i <=n; i++) {
			map[i][i]=1;
			map[i][0]=1;
			map[0][i]=1;
		}
		 for (int i = 1; i <=n; i++) {
			count+=f(n,i);
			count%=10000;
//			System.out.println(count);
		}
		 System.out.println(count);
//		 System.out.println(f(4,2));
		 
	}
	public static int f(int x,int y){
		if(map[x][y]!=0){
			return map[x][y];
		}
		for (int i = Math.abs(x-y)-1; i>=0; i--) {
			map[x][y]+=f(y,i);
		}
		map[x][y]%=10000;
//		map[y][x]=map[x][y];
//		System.out.println();
		return map[x][y];
	}

}



package 第十三次模拟;

import java.util.Scanner;

public class 正整数序列 {
	public static int n = 0, count = 0;
	public static int[][] map;

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		sc.close();
		map = new int[n + 2][n + 2];
		for (int i = 1; i <= n; i++) {
			map[i][i] = 1;
			map[i][0] = 1;
			map[0][i] = 1;
			map[i][i - 1] = 1;
			map[i - 1][i] = 1;
			// map[i+1][i]=1;
			// map[i][i+1]=1;

			// for (int j = i-1; j>=0; j--) {
			// for (int j2 = Math.abs(i-n)-1; j2 >=0; j2--) {
			// map[n][i]+=map[i][j2];
			// }
			// map[n][i]%=10000;
			//// }
			// System.out.println(map[n][i]);
			// count+=map[n][i];
		}
		for (int i = 1; i <= n; i++) {
			// System.out.print(n+" "+i+" "+map[n][i]+" ");
			if (map[n][i] == 0) {

				for (int j2 = 0; j2 <= Math.abs(i - n) - 1; j2++) {
					if (map[i][j2] == 0) {
						f(i, j2);
						// for (int j = 0; j<=Math.abs(i-j2)-1; j++) {
						// map[i][j2]+=map[j2][j];
						// }
						// map[j2][i]=map[i][j2];
					}
					map[n][i] += map[i][j2];
					// System.out.print(i+" "+j2+" ");
				}
				map[n][i] %= 10000;
			}
			// }

			// System.out.println(n+" "+i+" "+map[n][i]);
			// System.out.println(map[n][i]);
			count += map[n][i];
			count %= 10000;
			// if(map[i][n]==0)
			map[i][n] = map[n][i];
			// count+=f(n,i);
			// count%=10000;
			//// System.out.println(count);
		}
		System.out.println(count);
		long end = System.currentTimeMillis();
		System.out.println(end - start);
		// System.out.println(f(4,2));

	}

	public static int f(int x, int y) {
		if (map[x][y] != 0) {
			return map[x][y];
		}
		for (int i = Math.abs(x - y) - 1; i >= 0; i--) {
			map[x][y] += f(y, i);
		}
		map[x][y] %= 10000;
		// map[y][x]=map[x][y];
		// System.out.println();
		return map[x][y];
	}

}

原文地址:https://www.cnblogs.com/a1439775520/p/12946554.html