importjava.util.*;importjava.io.*;publicclassMain{staticintN=6010;staticint idx =0;staticint[] happy =newint[N];staticint[] h =newint[N];staticint[] e =newint[N];staticint[] ne =newint[N];staticint[][] f =newint[N][2];staticboolean[] h_father =newboolean[N];staticvoidadd(int a,int b){// 单链表进行存储,将a接在b的后面
e[idx]= b;
ne[idx]= h[a];
h[a]= idx++;}staticvoiddfs(int u){
f[u][1]= happy[u];// 初始化,选择u节点则,则此处值为happy值for(int i = h[u]; i !=-1; i = ne[i]){// 遍历u节点下面的节点int j = e[i];dfs(j);// dfs进一步求解
f[u][0]= f[u][0]+Math.max(f[j][0],f[j][1]);// 不选择u节点,则u节点总的快乐指数
f[u][1]= f[u][1]+ f[j][0];// 选择u节点,则快乐指数为// u节点的快乐指数是由下面的节点选择来决定一部分的}}publicstaticvoidmain(String[] args)throwsIOException{BufferedReader in =newBufferedReader(newInputStreamReader(System.in));Arrays.fill(h,-1);String str1 = in.readLine();int n =Integer.parseInt(str1);for(int i =1; i <= n; i++){String str2 = in.readLine();
happy[i]=Integer.parseInt(str2);// happy节点大小}for(int i =0; i < n -1; i++){String[] str3 = in.readLine().split(" ");int a =Integer.parseInt(str3[0]);int b =Integer.parseInt(str3[1]);
h_father[a]=true;// 说明a节点有父节点了,还不会停下add(b, a);}int root =1;while(h_father[root]){
root++;// 整棵树的大小}dfs(root);// 树的最顶层System.out.println(Math.max(f[root][0],f[root][1]));// 选择最顶层的节点进行是否选择的判断}}
二、记忆化搜索
1、题目内容
2、状态划分
(1)状态编号
f[i][j]:所有从(i, j)开始滑的路径
(2)状态划分
在满足高低条件情况下,对上下左右进行遍历
3、题解
importjava.util.*;importjava.io.*;publicclassMain{staticintN=310;staticint n,m;staticint[][] h =newint[N][N];staticint[][] f =newint[N][N];staticint[] dx ={-1,0,1,0};staticint[] dy ={0,1,0,-1};staticintdp(int x,int y){if(f[x][y]!=-1){return f[x][y];}
f[x][y]=1;// 说明还没有算过,需要重新初始化为1,因为最差是遍历自己一遍,也就是自己只滑了自己这一个格子for(int i =0; i <4; i++){int a = x + dx[i];//表示上下左右int b = y + dy[i];if(a >=1&& a <= n && b >=1&& b <= m && h[a][b]< h[x][y]){// 不可以等于,因为必须是低于才可以
f[x][y]=Math.max(f[x][y],dp(a, b)+1);// 寻找 fxy 和 推掉一个点到ab+1之间谁是最大}}return f[x][y];}publicstaticvoidmain(String[] args)throwsIOException{BufferedReader in =newBufferedReader(newInputStreamReader(System.in));String[] str1 = in.readLine().split(" ");
n =Integer.parseInt(str1[0]);
m =Integer.parseInt(str1[1]);for(int i =0; i <N; i++){Arrays.fill(f[i],-1);// 初始化为 -1 判断是否dp计算过滑雪距离,因为递归的存在,让其可以完美找到最低点}for(int i =1; i <= n ; i++){String[] str2 = in.readLine().split(" ");for(int j =1; j <= m; j++){
h[i][j]=Integer.parseInt(str2[j -1]);}}int res =0;for(int i =1; i <= n; i++){for(int j =1; j <= m; j++){
res =Math.max(res,dp(i, j));// 递归存在,完美找到最低点,然后遍历上来}}System.out.println(res);}}
文章目录 对于普通的 Linux 操作系统对于 Red Hat Enterprise Linux 9 笔者的运行环境: CentOS 8 Red Hat Enterprise Linux 9 在 Linux 中将本地网络 IP 设置为静态的,只需要在那台 Linux 上设置即可。为了方便,这里笔者使用了 Xshell 来远…