提交 e2c490cf 编写于 作者: qq_36480062's avatar qq_36480062

c

上级 9ae067a2
......@@ -54,8 +54,8 @@ public class 山峰和山谷 {
if (g[a][b] > g[x][y]) High = true;
else if (g[a][b] < g[x][y]) low = true;
} else if (!vis[a][b]) {
//显然这一步最重要,进入队列的都是满足未访问过该节点且与拓展之前的节点值相同
//则显然,一遍bfs会把一个连通块权值相同的连通块都遍历到
//这一步最重要,进入队列的都是满足未访问过该节点且与拓展之前的节点值相同
//一遍bfs会把一个连通块权值相同的连通块都遍历到
q.add(a * n + b);
}
}
......
......@@ -30,7 +30,8 @@ public class IO加速 {
public static void main(String[] args) throws IOException {
// fff();
sw();
// sw();
dfs(4, 1, new ArrayList<Integer>());
// f();
// tokenizer = new StringTokenizer("123123 15412 4312412");
// System.out.println(tokenizer.nextToken());
......@@ -66,9 +67,25 @@ public class IO加速 {
System.out.println((t - s) / 1e8);
}
static void dfs(int sum, int n, ArrayList<Integer> q) {
if (sum == 0) {
System.out.println(q);
return;
}
System.out.println(q + " " + n);
for (int i = n; i < sum; i++) {
if (sum - i >= 0) {
q.add(i);
dfs(sum - i, i, q);
q.remove(q.size() - 1);
}
}
}
static void sw() {
long s = System.nanoTime(); for (int i = 0; i < par.length; i++) {
long s = System.nanoTime();
for (int i = 0; i < par.length; i++) {
par[i] = i;
}
for (int i = 0; i < par.length; i++) {
......@@ -77,7 +94,8 @@ public class IO加速 {
long t = System.nanoTime();
System.out.println((t - s) / 1e8);
s = System.nanoTime(); for (int i = 0; i < par.length; i++) {
s = System.nanoTime();
for (int i = 0; i < par.length; i++) {
par[i] = i;
}
for (int i = 0; i < par.length; i++) {
......
......@@ -5,6 +5,7 @@ import java.util.Scanner;
public class 二分开方 {
public static void main(String[] args) {
dk(new BigDecimal(1233L));
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
double l = 0, r = n;
......
......@@ -55,11 +55,11 @@ public class 石子合并 {
//要先更新小区间的答案,按照拓扑序
for (int len = 2; len <= n; len++) {
for (int i = 1; i + len - 1 <= n; i++) {
int j = i + len - 1;
f[i][j] = (int) 1e9;
for (int k = i; k < j; k++) {
f[i][j] = Math.min(f[i][j], f[i][k] + f[k + 1][j] + s[j] - s[i - 1]);
for (int l = 1; l + len - 1 <= n; l++) {
int r = l + len - 1;
f[l][r] = (int) 1e9;
for (int k = l; k < r; k++) {
f[l][r] = Math.min(f[l][r], f[l][k] + f[k + 1][r] + s[r] - s[l - 1]);
}
}
}
......@@ -70,7 +70,7 @@ public class 石子合并 {
static int dfs(int i, int j) {
if (i == j) return 0;
if (dp[i][j] != -1) return dp[i][j];
int ans = (int) 1e9;
int ans = Integer.MAX_VALUE / 2;
for (int k = i; k < j; k++) {
ans = Math.min(ans, dfs(i, k) + dfs(k + 1, j) + s[j] - s[i - 1]);
}
......
......@@ -3,7 +3,22 @@ package dp.区间dp;
import java.util.Scanner;
/**
*
* https://blog.csdn.net/qq_30277239/article/details/104377152
* 环形dp,环展开成链求解
* 状态表示f[L,R]{
* 集合:所有将[L,R]合并到一起的矩阵的方式
* 属性:Max
* 状态计算:
* }状态划分:{
* 考虑最后的不同点:分界线
* 分成若干个子集:
* L+1,L+2...R-2,R-1;
* 考虑第k个分界线
* (L,K)(K,R)+cost
* 使得上式最大,f[L,K]+f[K,R]+w[i]*w[k]*w[r]
* }
* f[1,n]即为答案
* 环展开为链
*/
public class 能量项链 {
public static void main(String[] args) {
......@@ -13,22 +28,14 @@ public class 能量项链 {
a[i] = sc.nextInt();
a[i + n] = a[i];
}
for (int len = 3; len <= n + 1; len++) {//枚举长度
for (int l = 1; l + len - 1 <= n * 2; l++) {
for (int len = 3; len <= n + 1; len++) {//枚举长度,起码三个数才能表示2个矩阵,消掉中间那个数
for (int l = 1; l + len - 1 <= n * 2; l++) {//枚举起点
int r = l + len - 1;
for (int k = l; k < r; k++) {
for (int k = l + 1; k < r; k++) {//枚举分界线
f[l][r] = Math.max(f[l][r], f[l][k] + f[k][r] + a[l] * a[r] * a[k]);
}
}
}
for (int len = 1; len <= n + 1; len++) {
for (int l = 1; l + len - 1 <= n * 2; l++) {
int r = l + len - 1;
for (int k = l; k < r; k++) {
}
}
}
int res = 0;
for (int i = 1; i <= n; i++) {
res = Math.max(res, f[i][i + n]);
......
package dp.线性dp;
import java.util.Arrays;
import java.util.Scanner;
public class POJ3486电脑 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
c = sc.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
m[i][j] = sc.nextInt();
}
}
Arrays.fill(f, Integer.MAX_VALUE / 2);
f[0] = 0;
f[1] = m[1][1] + c;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
f[i] = Math.min(f[i], f[j - 1] + m[j][i] + c);
}
System.out.println(f[i]);
}
System.out.println(f[n]);
}
static int n, c;
static int[] f = new int[1000];
static int[][] m = new int[1000][1000];
}
......@@ -40,32 +40,52 @@ import java.util.Scanner;
public class floyd {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
k = sc.nextInt();
int x, y, z, t = Integer.MAX_VALUE / 2;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) g[i][j] = 0;
else g[i][j] = t;
// n = sc.nextInt();
// m = sc.nextInt();
// k = sc.nextInt();
// int x, y, z, t = Integer.MAX_VALUE / 2;
// for (int i = 1; i <= n; i++) {
// for (int j = 1; j <= n; j++) {
// if (i == j) g[i][j] = 0;
// else g[i][j] = t;
// }
// }
// for (int i = 0; i < m; i++) {
// x = sc.nextInt();
// y = sc.nextInt();
// z = sc.nextInt();
// g[x][y] = Math.min(g[x][y], z);
// }
int[][] g = {
{8, 20, 32, 56, 54, 40},
{20, 10, 48, 64, 34, 20},
{32, 48, 8, 24, 54, 42},
{56, 64, 24, 10, 30, 50},
{54, 34, 54, 30, 6, 28},
{40, 20, 42, 50, 28, 12}};
// floyd(g);
for (int k = 0; k < 6; k++) {
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
g[i][j] = Math.min(g[i][k] + g[k][j], g[i][j]);
}
}
}
for (int i = 0; i < m; i++) {
x = sc.nextInt();
y = sc.nextInt();
z = sc.nextInt();
g[x][y] = Math.min(g[x][y], z);
}
floyd();
while (k-- != 0) {
x = sc.nextInt();
y = sc.nextInt();
if (g[x][y] > t / 2) System.out.println("Imposs");
else System.out.println(g[x][y]);
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
System.out.print(g[i][j] + " ");
}
System.out.println();
}
// while (k-- != 0) {
// x = sc.nextInt();
// y = sc.nextInt();
// if (g[x][y] > t / 2) System.out.println("Imposs");
// else System.out.println(g[x][y]);
// }
}
static void floyd() {
static void floyd(int[][] g) {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
......@@ -75,7 +95,7 @@ public class floyd {
}
}
static int n, m, k;
static int n = 5, m, k;
static int[][] g = new int[210][210];
// static int[][] g = new int[210][210];
}
......@@ -4,7 +4,7 @@ import java.util.TreeSet;
/**
* a[i] 1 3 100 200 50000
* 0 1 2 3 4
* 0 1 2 3 4
* 算出x离散化后的值,二分
* a[i]中应该去重有序
*/
......
package 数学;
//https://blog.csdn.net/weixin_43237242/article/details/97388834
public class 欧拉函数 {
public static void main(String[] args) {
System.out.println(euler(6));
System.out.println(euler(12));
}
static long euler(long n) {
long ans = n;
for (int i = 2; i * i <= n; i++) {
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) {
n/=i;
n /= i;
}
}
}
if (n>1)ans=ans/n*(n-1);
if (n > 1) ans = ans / n * (n - 1);
return ans;
}
}
package 数学;
import java.util.Arrays;
//线性筛质数
//https://blog.csdn.net/qq_30277239/article/details/103687477
public class 线性筛 {
public static void main(String[] args) {
ol(100);
long s = System.nanoTime();
oldN(4234567);
oldN(3234567);
long t = System.nanoTime();
System.out.println((t - s) / 1e9);
}
......@@ -24,15 +26,39 @@ public class 线性筛 {
if (i % prime[j] == 0) break;
}
}
System.out.println(Arrays.toString(prime));
}
static boolean isprimer(int x) {
if (x == 2) return true;
if (x < 2 || x % 2 == 0) return false;
int t = (int) Math.sqrt(x);
for (int i = 3; i <= t; i += 2) {
if (x % i == 0) return false;
}
return true;
}
static void euler(int n) {
boolean[] vis = new boolean[n + 1];
int cnt = 0;
int[] primer = new int[n + 1];
for (int i = 2; i <= n; i++) {
if (!vis[i]) primer[cnt++] = i;
for (int j = 0; primer[j] <= n / i; j++) {
vis[primer[j] * i] = true;
if (i % primer[j] == 0) break;
}
}
}
//求第N个质数是多少
static void oldN(int N) {
int n = 6000000;
int n = (int) 1e7;
int r = 0;
while ((n / Math.log(n)) < N) {
r++;
n += 5000;
n += 100000;
}
System.out.println(r);
int cnt = 0;
......@@ -40,7 +66,8 @@ public class 线性筛 {
vis = new boolean[n + 1];
for (int i = 2; i <= n; i++) {
if (!vis[i]) prime[cnt++] = i;
for (int j = 0; prime[j] <= n / i; j++) {
r = n / i;
for (int j = 0; prime[j] <= r; j++) {
vis[prime[j] * i] = true;
if (i % prime[j] == 0) break;
}
......
......@@ -25,7 +25,6 @@ public class m任取n满足 {
e = System.nanoTime();
System.out.println((e - a) / 1e8);
}
static int ans, n = 30, k = 8, suma = 200;
......
import java.util.Scanner;
public class P1002过河卒 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
sx = sc.nextInt();
sy = sc.nextInt();
tx = sc.nextInt();
ty = sc.nextInt();
}
static int[][] g = new int[30][30];
static int sx, sy, tx, ty;
}
import java.util.Arrays;
import java.util.Scanner;
public class P1216数字三角形 {
public static void main(String[] args) {
f();
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
g[i][j] = sc.nextInt();
}
}
for (int i = n; i >= 1; i--) {
for (int j = n; j >= 1; j--) {
g[i][j] += Math.max(g[i + 1][j], g[i + 1][j + 1]);
}
}
System.out.println(g[1][1]);
}
static void f() {
n = 9999;
boolean[] st = new boolean[99999];
int[] pr = new int[9999];
int cnt = 0;
for (int i = 2; i < 9999; i++) {
if (!st[i]) pr[cnt++] = i;
for (int j = 0; pr[j] <= n / i; j++) {
st[pr[j] * i] = true;
if (i % pr[j] == 0) break;
}
}
System.out.println(Arrays.toString(pr));
}
static int[][] g = new int[1010][1010];
static int n;
}
import java.util.Arrays;
import java.util.Scanner;
public class P1434滑雪 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
g[i][j] = sc.nextInt();
}
Arrays.fill(mem[i], 1);
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ans = Math.max(dfs(i, j), ans);
}
}
System.out.println(ans);
}
static int dfs(int i, int j) {
if (mem[i][j] > 1) return mem[i][j];
for (int k = 0; k < 4; k++) {
int nx = dir[k][0] + i, ny = dir[k][1] + j;
if (nx >= 0 && nx < n && ny >= 0 && ny < m)
if (g[nx][ny] < g[i][j])
mem[i][j] = Math.max(dfs(nx, ny) + 1, mem[i][j]);
}
return mem[i][j];
}
static int[][] dir = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}};
static int[][] g = new int[110][110];
static int[][] mem = new int[110][110];
static int n, m;
}
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
*
*/
public class _152乘积最大子序列 {
public static void main(String[] args) throws ScriptException {
dfs(0, 0, "");
System.out.println(Calculation("1+3"));
}
static void dfs(int s, int state, String g) throws ScriptException {
if (s == 9) {
if (Calculation(g) == 1) {
System.out.println(g + "=1");
}
return;
}
for (int i = 0; i <= 9; i++) {
if (((state >> i) & 1) != 1) {
state += 1 << i;
for (int j = 0; j < 4; j++) {
if (s == 8) {
String t = g;
dfs(s + 1, state, g + i);
g = t;
} else {
String t = g;
dfs(s + 1, state, g + i + op[j]);
g = t;
}
}
}
}
}
static char[] op = {'+', '-', '*', '/'};
public static Double Calculation(String formula) {
Double result = null; //计算结果
ScriptEngineManager manager = new ScriptEngineManager(); //创建一个ScriptEngineManager对象
ScriptEngine engine = manager.getEngineByName("js"); //通过ScriptEngineManager获得ScriptEngine对象
try {
result = (Double) engine.eval(formula); //用ScriptEngine的eval方法执行脚本
} catch (ScriptException e) {
result = Double.NaN;
return result;
}
return result;
}
}
/**
*
*/
public class _174地下城游戏 {
public static void main(String[] args) {
}
}
public class _670最大交换 {
public static void main(String[] args) {
}
//ac
public static int maximumSwap(int num) {
int res = num;
StringBuilder s = new StringBuilder().append(num);
for (int i = 0; i < s.length(); i++) {
for (int j = i + 1; j < s.length(); j++) {
s = new StringBuilder().append(num);
char t = s.charAt(i);
s.setCharAt(i, s.charAt(j));
s.setCharAt(j, t);
res = Math.max(res, Integer.parseInt(s.toString()));
}
}
return res;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册