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];
public final static long p = 99999999L;
public long[][] getNofMatrix(long n) {
if(n == 0)
return ZERO;
if(n == 1)
return UNIT;
if((n & 1) == 0) {
long[][] matrix = getNofMatrix( n >> 1);
return multiOfMatrix(matrix, matrix);
}
long[][] matrix = getNofMatrix((n - 1) >> 1);
return multiOfMatrix(multiOfMatrix(matrix, matrix), UNIT);
}
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);
}
}
2.第 N 个泰波那契数
public class Main{
public static void main(String[] args){
Solution slt = new Solution();
System.out.println(slt.tribonacci(5));
}
}
class Solution {
public int tribonacci(int n) {
if(n==0)
return 0;
if(n==1)
return 1;
if(n==2)
return 1;
int[] taibonaqie = new int[n+1];
taibonaqie[0] = 0;
taibonaqie[1] = 1;
taibonaqie[2] = 1;
for(int i = 3; i <= n; i++){
taibonaqie[i] = taibonaqie[i-1]+taibonaqie[i-2]+taibonaqie[i-3];
}
return taibonaqie[n];
}
}
3.爬楼梯
class Main {
public int maxSubArray(int[] nums) {
int dp[]=new int[nums.length];
dp[0]=nums[0];
int max=dp[0];
for(int i=1;i<dp.length;i++){
//compare the num last status plus current num and current num
dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
//compare max and dp[i],it will update max
max=Math.max(max,dp[i]);
}
return max;
}
}
4.使用最小花费时间爬楼梯
class Main {
public int minCostClimbingStairs(int[] cost) {
int a = 0;
int b = 0;
for (int c : cost) {
int cur = Math.min(a, b) + c;
a = b;
b = cur;
}
return Math.min(a, b);
}
}
5.买卖股票的最佳时机
class Main {
public int maxProfit(int[] prices) {
if (prices.length <= 1) {
return 0;
}
int[] profitArr = new int[prices.length];
int minIndex = 0;
int profit = 0;
int leftMaxProfit = 0;
for (int i = 0; i < prices.length; i++) {
if (prices[i] - prices[minIndex] >= leftMaxProfit) {
leftMaxProfit = prices[i] - prices[minIndex];
}
profitArr[i] = leftMaxProfit;
if (prices[i] < prices[minIndex]) {
minIndex = i;
}
}
int maxIndex = prices.length - 1;
for (int i = prices.length - 1; i >= 0; i--) {
if (prices[maxIndex] - prices[i] + profitArr[i] > profit) {
profit = prices[maxIndex] - prices[i] + profitArr[i];
}
if (prices[maxIndex] < prices[i]) {
maxIndex = i;
}
}
return profit;
}
}
6.最长公共子序列
import java.util.Scanner;
public class Main {
public static String S1,S2;
public static char[] s1 ;
public static char[] s2 ;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
S1=sc.next();
S2=sc.next();
s1=S1.toCharArray();
s2=S2.toCharArray();
int[][] dp = new int[1001][1001];
for(int i=1;i<=s1.length;i++){
for(int j=1;j<=s2.length;j++){
if(s1[i-1]==s2[j-1]){
dp[i][j]=1+dp[i-1][j-1];
}
else if(s1[i-1]!=s2[j-1]){
dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
}
}
}
System.out.println(dp[s1.length][s2.length]);
}
}
7.杨辉三角
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n, i, j;
int arr[][] = new int[34][34];
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
sc.close();
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
arr[i][0] = 1;
if (i == j) {
arr[i][j] = 1;
}
}
}
// 求和
for (i = 2; i < n; i++) {
for (j = 1; j < n; j++) {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (i = 0; i < n; i++) {
for (j = 0; j <= i; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
8.节点选择
import java.util.Scanner;
public class Main {
public int[][] dp = new int[100002][2];
public int[][] tree = new int[100002][300];
public void creatTree(int point1, int point2) {
int i = 0;
while(tree[point1][i] != 0) i++;
tree[point1][i] = point2;
int j = 0;
while(tree[point2][j] != 0) j++;
tree[point2][j] = point1;
}
public void dfs(int start, int root) {
int child = tree[start][0];
for(int i = 0;child != 0;i++) {
child = tree[start][i];
if(child != root) {
dfs(child, start);
dp[start][1] += dp[child][0];
dp[start][0] += (dp[child][1] > dp[child][0] ? dp[child][1] : dp[child][0]);
}
}
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i = 0;i < n;i++)
test.dp[i + 1][1] = in.nextInt();
for(int i = 0;i < n - 1;i++) {
int point1 = in.nextInt();
int point2 = in.nextInt();
test.creatTree(point1, point2);
}
test.dfs(1, 0);
int max = (test.dp[1][1] > test.dp[1][0] ? test.dp[1][1] : test.dp[1][0]);
System.out.println(max);
}
}
9. 耐摔指数
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int [] x=new int [1000];
int sum=1;
for(int i=0;sum<n;i++){
sum=i+sum;
x[i]=sum;
}
sum=1;
int k=0;
for(int i=0;sum<n;i++){
sum=x[i]+sum;
k++;
}
System.out.println(k);
}
}
10. K 好数
import java.util.Scanner;
public class Main {
public static int mod = 1000000007;
public int[][] dp = new int[102][102];
public void printResult(int K, int L) {
for(int i = 0;i < K;i++)
dp[1][i] = 1;
for(int i = 2;i <= L;i++) {
for(int j = 0;j < K;j++) {
for(int f = 0;f < K;f++) {
if(f - 1 != j && f + 1 != j) {
dp[i][j] += dp[i - 1][f];
dp[i][j] %= mod;
}
}
}
}
int sum = 0;
for(int i = 1;i < K;i++) {
sum += dp[L][i];
sum %= mod;
}
System.out.println(sum);
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int K = in.nextInt();
int L = in.nextInt();
test.printResult(K, L);
}
}