1,垒骰子
//递归
package java2014;
import java.util.Scanner;
public class 垒骰子递归 {
public static boolean conlist[][] = new boolean[7][7];
public static int op[] = new int[7];
private static int MOD = 1000000007;
public static void main(String[] args) {
int n = 0;
int m = 0;
long ans = 0;
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
op[1] = 4;
op[4] = 1;
op[5] = 2;
op[2] = 5;
op[3] = 6;
op[6] = 3;
for (int i = 1; i <= m; i++) {
int x = scanner.nextInt();
int y = scanner.nextInt();
conlist[x][y] = true;
conlist[y][x] = true;
}
for (int up = 1; up <= 6; up++) {
ans = ans + 4 * f(up, n - 1);
}
System.out.println((ans) % MOD);
}
private static long f(int up, int cnt) {
long ans = 0;
if (cnt == 0)
return 4;
for (int upp = 1; upp <= 6; upp++) {
if (conlist[op[up]][upp])
continue;
ans = ans + f(upp, cnt - 1);
}
return ans;
}
}
2,垒骰子-》动态规划
package java2014;
import java.util.Scanner;
public class 垒骰子动态规划 {
public static boolean conlist[][] = new boolean[7][7];// 判断两个面是否互斥
public static int op[] = new int[7];// 映射互斥面
private static int MOD = 1000000007;
private static int dp[][] = new int[2][7];
public static void main(String[] args) {
int n = 0;
int m = 0;
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
op[1] = 4;
op[4] = 1;
op[5] = 2;
op[2] = 5;
op[3] = 6;
op[6] = 3;
for (int i = 1; i <= m; i++) {
int x = scanner.nextInt();
int y = scanner.nextInt();
conlist[x][y] = true;
conlist[y][x] = true;
}
// 滚动数组
// 初始化滚动数组第一行
for (int i = 1; i <= 6; i++) {
dp[0][i] = 1;
}
int cur = 0;
for (int leval = 2; leval <= n; leval++) {
cur = 1 - cur;
// 接下来要放的骰子那面朝上
for (int i = 1; i <= 6; i++) {
dp[cur][i] = 0;
for (int j = 0; j <= 6; j++) {
if (conlist[op[i]][j])
continue;
dp[cur][i] = (dp[cur][i] + dp[1 - cur][j]) % MOD;
}
}
}
long sum = 0;
for (int up = 1; up <= 6; up++) {
sum = (sum + dp[cur][up]) % MOD;
}
// 快速幂求n次方
long ans = 1;
long tmp = 4;
long p = n;
while (p != 0) {
if ((p & 1) == 1)
ans = (ans * tmp) % MOD;
tmp = (tmp * tmp) % MOD;
p >>= 1;
}
System.out.println((sum * ans) % MOD);
}
}
2,生命之树
package java2014;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class 生命之树 {
private static List<Integer> []g;
private static int n=1;
private static int ans=-1;
private static int []w;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
w=new int[n+1];
g=new ArrayList[n+1];
for(int i=1 ;i<=n;i++) {
w[i]=scanner.nextInt();
}
for(int i=1 ;i<=n;i++) {
g[i]=new ArrayList<>();
}
for(int i=0;i<n-1;i++) {
int a=scanner.nextInt();
int b=scanner.nextInt();
g[a].add(b);
g[b].add(a);
}
dfs(1,0);
System.out.println(ans);
}
private static void dfs(int u,int fg) {
for(int i=0;i<g[u].size();i++) {
Integer child=g[u].get(i);
if(child==fg)continue;
dfs(child, u);
if(w[child]>0) {
w[u]+=w[child];
}
if(w[u]>ans)ans=w[u];
}
}
}
3,移动距离
package java2014;
import java.time.Year;
import java.util.Scanner;
public class 移动距离 {
private static int ans;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int w=scanner.nextInt();
int m=scanner.nextInt();
int n=scanner.nextInt();
int x1=x(m,w);
int x2=x(n,w);
int y1=y(m,w);
int y2=y(n,w);
ans=Math.abs(x2-x1)+Math.abs(y2-y1);
System.out.println(ans);
}
private static int y(int m, int w) {
int x=x(m,w);
int y=0;
if(x%2==0) {
y=w-(m-(x-1)*w);
}else {
y=(m-(x-1)*w)-1;
}
return y;
}
private static int x(int m, int w) {
int l= m/w;
if(l==0) {
l=1;
}else {
if((m%w)!=0) {
l+=1;
}
}
return l;
}
}