问题1描述:【贪婪算法,Dijistra算法】

①有一只兔子要从一个N*N的二维矩阵方格中从上跳到下面;

②每次只能向左或向下,越过一个方格,跳到下一个方格中;

③被越过的方格中的数值,表示该兔子越过该方格后需要休息的时间(或者能量);

求:到达最下面方格花费的最少时间是多少?

输入:

第一行,输入一个数值N

后面输入N行,每行有N个数值并且由【,】隔开

输出:

输出一个数据M,M为兔子需要花费的最小时间

示例:
输入:
6
1,2,3,5,7,6
2,1,4,5,7,4
3,4,5,6,3,6
2,3,1,4,6,8
5,6,1,4,6,2
4,2,4,1,1,6
输出:
6

   

算法1【递归调用】:以后不考虑这种算法

注意:这种方法虽然可以结题,但是如果数据量太大,时间上耗时太多了,每次都不能全部AC,这次只能AC40%

package com.cnblogs.mufasa.demo1;

import java.util.Scanner;

class Answer1_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); String line = scanner.nextLine();
int n = Integer.parseInt(line);
int[][] area = new int[n][n]; for (int i = 0; i < n; i++) {
line = scanner.nextLine();
String[] split = line.split(",");
if (split.length != n) {
throw new IllegalArgumentException("错误输入");
}
int j = 0;
for (String num : split) {
area[i][j++] = Integer.parseInt(num);
}
} int minimumTimeCost = getMinimumTimeCost(n,area);
System.out.println(minimumTimeCost);
} /** 请完成下面这个函数,实现题目要求的功能 **/
/** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/
private static int getMinimumTimeCost(int n, int[][] area) {
long startTime = System.currentTimeMillis();
int[] nums=new int[n];
for(int i=0;i<n;i++){
nums[i]=getMinSingleLine(n,area,0,i,0);
}
int min=nums[0];
for(int i=1;i<n;i++){
if(min>nums[i]){
min=nums[i];
}
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
return min;
} private static int getMinSingleLine(int n,int[][] area,int index0,int index1,int times ){
if(index0==n-2&&(index1==n-1||index1==n-2)){//1,极限位置,正确
return times+area[index0+1][index1];
}else if(index1==n-1||index1==n-2){//2,只能往下走,正确
return getMinSingleLine(n,area,index0+2,index1,times+area[index0+1][index1]);
}else if(index0==n-2){//3,向下一步或向右,正确
return Math.min(times+area[index0+1][index1],getMinSingleLine(n,area,index0,index1+2,times+area[index0][index1+1]));
}else{
return Math.min(getMinSingleLine(n,area,index0+2,index1,times+area[index0+1][index1]),getMinSingleLine(n,area,index0,index1+2,times+area[index0][index1+1]));
}
}
}
/*
8
35,92,98,68,35,65,26,72
29,78,83,16,5,89,92,28
48,51,37,79,65,74,50,71
98,78,99,57,1,30,22,16
72,88,55,33,56,58,28,49
4,28,29,20,18,61,11,73
61,19,47,34,85,32,77,89
29,49,10,81,52,5,63,25
*/

算法2【贪婪算法】:Dijistra算法

算法思路:它和算法1中的原理有点像,但是引入了一个优先队列,每次进行移动都是从耗时最小的那个位置开始移动并且更新队列,当出现第一个到达目的地的数据 时,这个数据就是最快的数据

package com.cnblogs.mufasa.demo1;

import java.util.PriorityQueue;
import java.util.Scanner; public class Answer1_2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); String line = scanner.nextLine();
int n = Integer.parseInt(line);
int[][] area = new int[n][n]; for (int i = 0; i < n; i++) {
line = scanner.nextLine();
String[] split = line.split(",");
if (split.length != n) {
throw new IllegalArgumentException("错误输入");
}
int j = 0;
for (String num : split) {
area[i][j++] = Integer.parseInt(num);
}
} int minimumTimeCost = getMinimumTimeCost(n,area);
System.out.println(minimumTimeCost);
}
/** 请完成下面这个函数,实现题目要求的功能 **/
/** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/
private static int getMinimumTimeCost(int n, int[][] area) {//贪婪算法,每次对优先队列的最小对象进行操作
long startTime = System.currentTimeMillis();
PriorityQueue<Loc> queue=new PriorityQueue<>(3*n);//最小堆实现优先队列
for(int i=0;i<n;i++){//初始化触发机关的位置
queue.add(new Loc(1,i,area[1][i]));
}
Loc preLoc;
while (true){
preLoc=queue.poll();
if(preLoc.index0==n-1){//已经到达目的地
break;
}
if(preLoc.index1==n-2||preLoc.index1==n-1){//右边界情况,只能向下
queue.add(new Loc(preLoc.index0+2,preLoc.index1,preLoc.times+area[preLoc.index0+2][preLoc.index1]));
}else {//可以向下、向右
queue.add(new Loc(preLoc.index0+2,preLoc.index1,preLoc.times+area[preLoc.index0+2][preLoc.index1]));
queue.add(new Loc(preLoc.index0,preLoc.index1+2,preLoc.times+area[preLoc.index0][preLoc.index1+2]));
}
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
return preLoc.times;
}
static class Loc implements Comparable{
public int times;
public int index0,index1;
public Loc(int index0,int index1,int times){
this.index0=index0;
this.index1=index1;
this.times=times;
}
@Override
public int compareTo(Object obj) {
return times-((Loc)obj).times;
}
}
} /*
8
35,92,98,68,35,65,26,72
29,78,83,16,5,89,92,28
48,51,37,79,65,74,50,71
98,78,99,57,1,30,22,16
72,88,55,33,56,58,28,49
4,28,29,20,18,61,11,73
61,19,47,34,85,32,77,89
29,49,10,81,52,5,63,25
*/

问题2描述:

①若干男女生围成一圈;

②求身边女生个数最多的男生位置,个数相同去最先出现的同学;

③求男生最大的团体人数,其中最多可以包含k个女士;

举一反三

问题描述:

现有一个长度为n的序列,需要你求出最长的非增子序列,使得其长度最长,并且这个子序列是满足非增性质的。输出最长长度

输入样例:

5

1 2 1 3 4

输出样例:

4

其中有如下满足要求的子序列:

① 1 2 3 4;②1 1 3 4

奇妙的算法【7】-贪婪算法-dp的更多相关文章

  1. [算法模版]子序列DP

    [算法模版]子序列DP 如何求本质不同子序列个数? 朴素DP 复杂度为\(O(nq)\).其中\(q\)为字符集大小. \(dp[i]\)代表以第\(i\)个数结尾的本质不同子序列个数.注意,这里对于 ...

  2. [算法模板]SOS DP

    [算法模板]SOS DP 正文 SOS-DP(\(\text{Sum over Subsets}\))是用来解决这样的问题的: 其实就是子集和DP.上面每个\(F[mask]\)里面包含了\(mask ...

  3. 奇妙的算法之LCS妙解

    LCS算法妙解 LCS问题简述:最长公共子序列 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列. LCS问题的分支:最长公共子串 ...

  4. [LeetCode] Network Delay Time 网络延迟时间——最短路算法 Bellman-Ford(DP) 和 dijkstra(本质上就是BFS的迭代变种)

    There are N network nodes, labelled 1 to N. Given times, a list of travel times as directed edges ti ...

  5. 算法笔记--数位dp

    算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置. 模板: ]; ...

  6. 算法复习——背包dp

    1.01背包 二维递推式子: 代码: ;i<=n;i++) ;x--) ][x-w[i]]+c[i],f[i-][x]); ][x]; printf("%d",f[n][m] ...

  7. 奇妙的算法【11】LeetCode-专属算法面试题汇总

    这个是LeetCode上面的编程训练专项页面,地址:https://leetcode-cn.com/explore/interview/card/top-interview-quesitons-in- ...

  8. 奇妙的算法【10】TX--有效号码、最,小耗时、最小差值、差值输出、异或结果

    昨晚刚刚写的几道算法题,难度也还行,就是全部AC有些困难,当时第一题AC.第二题AC 60%,第四题AC 40%,第五题没有时间写完了,这个应该全部AC了:其中第三题没有写出来 1,是否存在符合规范的 ...

  9. LIS(nlogn)算法描述//线性DP经典类型

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

随机推荐

  1. GCC编译流程及常用编辑命令

    GCC 编译器在编译一个C语言程序时需要经过以下 4 步: 将C语言源程序预处理,生成.i文件. 预处理后的.i文件编译成为汇编语言,生成.s文件. 将汇编语言文件经过汇编,生成目标文件.o文件. 将 ...

  2. layui跨域问题的解决

      跨域问题的解决 由于浏览器存在同源策略,所以如果 layui(里面含图标字体文件)所在的地址与你当前的页面地址不在同一个域下,即会出现图标跨域问题.所以要么你就把 layui 与网站放在同一服务器 ...

  3. python -- 安装+pip+requests

    python3 安装库 sudo python3 -m pip install beautifulsoup4   步骤1:安装pyenv 为了能顺利的将系统的python和下载的python版本呼唤, ...

  4. vue项目中 favicon.ico不能正确显示的问题

    方法一:修改index.html文件 <link rel="shortcut icon" type="image/x-icon" href="f ...

  5. xss绕过姿势

    #未完待续... 00x1.绕过 magic_quotes_gpc magic_quotes_gpc=ON 是php中的安全设置,开启后会把一些特殊字符进行轮换, 比如: ' 会被转换为 \' 再比如 ...

  6. 深入理解DefaultMessageListenerContainer

    DefaultMessageListenerContainer是一个用于异步消息监听的管理类. DefaultMessageListenerContainer最简单的实现逻辑,一个任务执行器,执行任务 ...

  7. zblog上传安装主题插件不成功的原因和解决办法

    最近有不少zblog用户反映在后台上传安装主题或者插件的时候出现了问题.本文就来尝试说明下这类问题的原因和解决办法. 首先来说说zblog主题或者插件的安装方法,一共有三种方式: 第一种是直接在网站后 ...

  8. React调试——visual studio code

    原文链接:Using React in Visual Studio Code 原文链接:Live edit and debug your React apps directly from VS Cod ...

  9. Laravel 项目开发环境配置

    1.首先安装Laravel 依赖管理包工具 Composer (前提是本地装好了PHP  php -v) php -r "copy('https://install.phpcomposer. ...

  10. (三)java虚拟机内存管理和线程独占区和线程共享区

    一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节 ...