java版本
import java.util.Scanner;
public class Main {
public int count(int n) {
// 初始化备忘录
int[] memory = new int[n + 1];
// base case 2和3都是1,2是为了保证算的正确性,实际上2不能过
memory[2] = 1;
memory[3] = 1;
// 带着备忘录递归算n边形有几种可能
return recursion(n, memory);
}
private int recursion(int n, int[] memory) {
// 如果填过了,直接返回
if (memory[n] != 0) {
return memory[n];
}
// 没填过,初始化sum
int sum = 0;
for (int i = 2; i <= n - 1; i++) {
// sum加和,根据推导,可分成三角形+i边形+(n-i+1)边形
// i可选范围是2~n-1
sum += (recursion(i, memory) * recursion(n - i + 1, memory));
}
// 算完,存入备忘录
memory[n] = sum;
// 返回
return memory[n];
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
// 特例,如果n<3,说明没答案
if(n<3){
System.out.println("No answer");
return;
}
System.out.println(new Main().count(n));
}
}
c版本
#include <iostream>
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <algorithm>
#include<cstdlib>
int recursion(int n,int* memory) {
if (memory[n] != 0) {
return memory[n];
}
int sum = 0;
for (int i = 2;i<=n-1; i++) {
sum += (recursion(i,memory) * recursion(n-i+1, memory)) ;
}
memory[n] = sum;
return memory[n];
}
int main()
{
int n;
cin >> n;
if (n < 3) {
printf("No answer");
return 0;
}
int* memory = new int[n + 1]{0};
memory[2] = 1;
memory[3] = 1;
printf("%d", recursion(n, memory));
return 0;
}