【期末算法课程设计十道题】-【动态规划】-【2-求数组不相邻元素和最大】有n个目标序列。 每个目标都有自己的得分,但你不能同时击中两个相邻的目标。 你想要得到尽可能多的分数。

大家好,我是被白菜拱的猪。

一个热爱学习废寝忘食头悬梁锥刺股,痴迷于girl的潇洒从容淡然coding handsome boy!

Time goes quickly!啊!没想到大二就这么稀里糊涂的过去,由于疫情原因,终究是没有开学,一学期啥也没听的我,最后还要做这个期末算法设计,不做不行啊,这日后可咋整啊,屁都不会,哪家公司要你。
只要功夫深,铁杵磨成绣花针。十道算法题,在没有听一节课的情况下,通过自学在查查百度看看能做出多少,在这里记录一下,奥利给!!!

第二题:

在这里插入图片描述
Description
There is a sequence of n targets.
Every target has its own score but you can’t shot two adjacent targets.
You want to get as many points as possible, so before you shot, you should calculate the scores you can get.

翻译:(用的有道嘻嘻)

有n个目标序列。
每个目标都有自己的得分,但你不能同时击中两个相邻的目标。
你想要得到尽可能多的分数,所以在你投篮之前,你应该计算你能得到的分数。

题目提示是用的动态规划,我擦嘞动态规划是什么东东???不说了有事没事问百度,看看动态规划常用语求解什么问题,在读读题目,发现这不就是求解数组不相邻元素和最大的问题吗,题目整的还那么高尚,竟装逼。

闲话不多说,找个视频链接学一学动态规划求解数组不相邻元素和最大的问题,这里我是看的b站上的一个视频,讲的蛮好
动态规划讲解

卧槽 这道题太坑了,算法真的太难了真的,要哭了,这道题要求数组里面又有负数又有正数,网上搜了半天都是正数的。最后提交出错,问了问我们班的同学,恍然大悟居然要考虑负数,经过自己仔细的思考 ,终于搞定,算法真的太难了。在看到答案正确的那一刻,留下了激动的泪水。
在这里插入图片描述
在这里插入图片描述

最后no代码有 say 个jb!

/**
 * 
 */
package com.java.algorithm;

import java.util.Scanner;

/**  
* @ClassName: Main  
* @Description: TODO(这里用一句话描述这个类的作用)  
* @author Lily  
* @date 2020年6月17日    
*/
public class Main {
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		int length=scan.nextInt();
		int[] array=new int[length];
		for(int i=0;i<array.length;i++){
			array[i]=scan.nextInt();
		}
		System.out.println(opt(array));
	}
	
	public static int opt(int[] array){
		int[] opt=new int [array.length];
		opt[0]=array[0];
		if(opt.length >1){
			opt[1]=Math.max(array[0], array[1]);
			for(int i=2;i<array.length;i++){
				//刚开始要对自己进行判断,是正还是负
				if(array[i]>0){
					//注意这步,很重要!!!分为两种情况,自己不选,和自己选
					int a=array[i]+(opt[i-2]>0?opt[i-2]:0);
					int b=opt[i-1];
					opt[i]=Math.max(a,b);
				}else{
					opt[i]=opt[i-1];
				}
				
			}
		}
		
		return opt[array.length-1];
	}
}

加油加油加油!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值