pull/3/head
Leo 5 years ago
parent 8fdf1142f0
commit 598edb3a3a

@ -0,0 +1,214 @@
package leo.class20;
import java.util.Comparator;
import java.util.PriorityQueue;
/**
* @author Leo
* @ClassName Coffee
* @DATE 2021/1/11 3:00
* @Description
* ,,,
* ,,,
* ,LR,,线线,,,.
* ,,
*
*
* arr
* n
*
*
* ab
* arr, n, a, b
* 0
*/
public class Coffee {
/**
*
*
* ,使,
*
* :
* ,,,,
* ,,,
* ,LR,,线线,L>R,,.
* ,
*/
static class Machine {
//提供服务的时间点
int timePoint;
//工作一次的时间
int workTime;
public Machine(int t,int w) {
timePoint = t;
workTime = w;
}
}
static class MachineComparator implements Comparator<Machine> {
@Override
public int compare(Machine o1, Machine o2) {
return (o1.timePoint + o1.workTime) - (o2.timePoint + o2.workTime);
}
}
static class Recursion {
/**
* :
* 0
* @author Leo
* @date 2021/1/11 3:15
* @param arr arr
* @param n n
* @param a a
* @param b b
* @return int
*/
public static int minTime(int[] arr, int n, int a, int b) {
PriorityQueue<Machine> heap = new PriorityQueue<>(new MachineComparator());
for (int i = 0; i < arr.length; i++) {
heap.offer(new Machine(0, arr[i]));
}
//所有杯子可以开始洗的时间
int[] drinks = new int[n];
for (int i = 0; i < n; i++) {
Machine cur = heap.poll();
cur.timePoint += cur.workTime;
drinks[i] = cur.timePoint;
heap.offer(cur);
}
return process(drinks, a, b, 0, 0);
}
/**
* :
* @author Leo
* @date 2021/1/11 3:21
* @param drinks
* @param wash
* @param air
* @param i
* @param free .
* @throw
* @return int
*/
private static int process(int[] drinks, int wash, int air, int i, int free) {
if (i == drinks.length) {
return 0;
}
//洗
int washClean = Math.max(drinks[i], free) + wash;
//洗的方式剩余干净的时间
int restWashClean = process(drinks, wash, air, i + 1, washClean);
int p1 = Math.max(washClean, restWashClean);
//挥发
int airClean = drinks[i] + air;
//挥发的方式剩余干净的时间
int restAirClean = process(drinks, wash, air, i + 1, free);
int p2 = Math.max(airClean, restAirClean);
return Math.min(p1, p2);
}
}
static class Dp {
public static int minTime(int[] arr, int n, int a, int b) {
PriorityQueue<Machine> heap = new PriorityQueue<>(new MachineComparator());
for (int i = 0; i < arr.length; i++) {
heap.offer(new Machine(0, arr[i]));
}
int[] drinks = new int[n];
for (int i = 0; i < n; i++) {
Machine cur = heap.poll();
cur.timePoint += cur.workTime;
drinks[i] = cur.timePoint;
heap.offer(cur);
}
return process(drinks, a, b);
}
private static int process(int[] drinks, int wash, int air) {
int n = drinks.length;
//求每个杯子洗完的最大时间
int maxFree = 0;
for (int i = 0; i < n; i++) {
maxFree = Math.max(maxFree, drinks[i]) + wash;
}
int[][] dp = new int[n + 1][maxFree + 1];
//上面依赖下面,从地下开始填
for (int i = n - 1; i >= 0; i--) {
//从左往右填
for (int free = 0; free < maxFree; free++) {
//洗
int washClean = Math.max(drinks[i], free) + wash;
//没有这个位置,防越界
if (washClean > maxFree) {
continue;
}
//洗的方式剩余干净的时间
int restWashClean = dp[i + 1][washClean];
int p1 = Math.max(washClean, restWashClean);
//挥发
int airClean = drinks[i] + air;
//挥发的方式剩余干净的时间
int restAirClean = dp[i + 1][free];
int p2 = Math.max(airClean, restAirClean);
dp[i][free] = Math.min(p1, p2);
}
}
return dp[0][0];
}
}
public static void main(String[] args) {
int len = 10;
int max = 10;
int testTime = 10;
System.out.println("测试开始");
for (int i = 0; i < testTime; i++) {
int[] arr = randomArray(len, max);
int n = (int) (Math.random() * 7) + 1;
int a = (int) (Math.random() * 7) + 1;
int b = (int) (Math.random() * 10) + 1;
int recursion = Recursion.minTime(arr, n, a, b);
int dp = Dp.minTime(arr, n, a, b);
if (recursion != dp ) {
printArray(arr);
System.out.println("n : " + n);
System.out.println("a : " + a);
System.out.println("b : " + b);
System.out.println(recursion + " , " + dp);
System.out.println("===============");
break;
}
}
System.out.println("测试结束");
}
// for test
public static int[] randomArray(int len, int max) {
int[] arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = (int) (Math.random() * max) + 1;
}
return arr;
}
// for test
public static void printArray(int[] arr) {
System.out.print("arr : ");
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + ", ");
}
System.out.println();
}
}

@ -0,0 +1,91 @@
package leo.class20;
/**
* @author Leo
* @ClassName HorseJump
* @DATE 2021/1/11 1:34
* @Description
*
*
*
* (0,0)
* 9线10线
* xyk
* (0,0)k
* (x,y)?
*/
public class HorseJump {
/**
* O(8^k)
*/
static class Recursion {
public static int jump(int a, int b, int k) {
return process(0, 0, k, a, b);
}
private static int process(int x, int y, int rest, int a, int b) {
if (x < 0 || x > 9 || y < 0 || y > 8) {
return 0;
}
if (rest == 0) {
return x == a && y == b ? 1 : 0;
}
int ways = process(x - 1, y - 2, rest - 1, a, b);
ways += process(x - 1, y + 2, rest - 1, a, b);
ways += process(x + 1, y - 2, rest - 1, a, b);
ways += process(x + 1, y + 2, rest - 1, a, b);
ways += process(x - 2, y + 1, rest - 1, a, b);
ways += process(x - 2, y - 1, rest - 1, a, b);
ways += process(x + 2, y + 1, rest - 1, a, b);
ways += process(x + 2, y - 1, rest - 1, a, b);
return ways;
}
}
/**
* O(k)
*/
static class Dp {
public static int jump(int a, int b, int k) {
int[][][] dp = new int[10][9][k + 1];
dp[a][b][0] = 1;
for (int rest = 1; rest <= k; rest++) {
for (int x = 0; x < 10; x++) {
for (int y = 0; y < 9; y++) {
int ways = pick(dp, x - 1, y - 2, rest - 1);
ways += pick(dp, x - 1, y + 2, rest - 1);
ways += pick(dp, x + 1, y - 2, rest - 1);
ways += pick(dp, x + 1, y + 2, rest - 1);
ways += pick(dp, x - 2, y + 1, rest - 1);
ways += pick(dp, x - 2, y - 1, rest - 1);
ways += pick(dp, x + 2, y + 1, rest - 1);
ways += pick(dp, x + 2, y - 1, rest - 1);
dp[x][y][rest] = ways;
}
}
}
return dp[0][0][k];
}
private static int pick(int[][][] dp, int x, int y, int rest) {
if (x < 0 || x > 9 || y < 0 || y > 8) {
return 0;
}
return dp[x][y][rest];
}
}
public static void main(String[] args){
int x = 7;
int y = 7;
int step = 10;
System.out.println(Recursion.jump(x, y, step));
System.out.println(Dp.jump(x, y, step));
}
}

@ -0,0 +1,113 @@
package leo.class20;
import java.util.function.IntPredicate;
/**
* @author Leo
* @ClassName PalindromeSubsequence
* @DATE 2021/1/11 10:12
* @Description
* https://leetcode-cn.com/problems/longest-palindromic-subsequence/
*
*
* .
*/
public class PalindromeSubsequence {
/**
* ,
*/
static class Reverse {
}
static class Recursion {
public static int longestPalindromeSubseq(String s) {
if (s == null || s.length() == 0) {
return 0;
}
char[] chars = s.toCharArray();
return f(chars, 0, chars.length - 1);
}
/**
* : lr
* @author Leo
* @date 2021/1/11 10:21
* @param str
* @param l
* @param r
* @return int
*/
public static int f(char[] str, int l, int r) {
if (l == r) {
return 1;
}
if (l == r - 1) {
return str[l] == str[r] ? 2 : 1;
}
int p1 = f(str, l + 1, r);
int p2 = f(str, l, r - 1);
int p3 = f(str, l + 1, r - 1);
int p4 = str[l] == str[r] ? (2 + f(str, l + 1, r - 1)) : 0;
return Math.max(Math.max(p1, p2), Math.max(p3, p4));
}
}
static class Dp {
public static int longestPalindromeSubseq(String s) {
if (s == null || s.length() == 0) {
return 0;
}
char[] str = s.toCharArray();
int n = str.length;
int[][] dp = new int[n][n];
dp[n - 1][n - 1] = 1;
for (int i = 0; i < n - 1; i++) {
dp[i][i] = 1;
dp[i][i + 1] = str[i] == str[i + 1] ? 2 : 1;
}
//从底网上填
for (int l = n - 3; l >= 0; l--) {
for (int r = l + 2; r < n; r++) {
int p1 = dp[l + 1][r];
int p2 = dp[l][r - 1];
int p3 = dp[l + 1][r - 1];
int p4 = str[l] == str[r] ? (2 + dp[l + 1][r - 1]) : 0;
dp[l][r] = Math.max(Math.max(p1, p2), Math.max(p3, p4));
}
}
return dp[0][n - 1];
}
public static int longestPalindromeSubseqMajorization(String s) {
if (s == null || s.length() == 0) {
return 0;
}
char[] str = s.toCharArray();
int n = str.length;
int[][] dp = new int[n][n];
dp[n - 1][n - 1] = 1;
for (int i = 0; i < n - 1; i++) {
dp[i][i] = 1;
dp[i][i + 1] = str[i] == str[i + 1] ? 2 : 1;
}
//从底网上填
for (int l = n - 3; l >= 0; l--) {
for (int r = l + 2; r < n; r++) {
dp[l][r] = Math.max(dp[l][r - 1], dp[l + 1][r]);
if (str[l] == str[r]) {
dp[l][r] = Math.max(dp[l][r], 2 + dp[l + 1][r - 1]);
}
}
}
return dp[0][n - 1];
}
}
public static void main(String[] args){
int a = Dp.longestPalindromeSubseq("a");
System.out.println(a);
}
}
Loading…
Cancel
Save