龙宫取宝

老龙王酷爱收藏宝贝,他搜罗了很多宝贝藏在他的龙宫之中。某日一小偷潜入龙宫之中企图盗窃龙宫宝物。假设宝物是被一字排列的,每个宝物都装在一个盒子里,
老龙王在某些盒子里设计了一些陷阱。小偷如果拿到装有宝物的盒子,则会获得一定的收益,如果盒子里有陷阱则会有一定的损失。小偷为了尽快的拿走宝物而不被发现,
决定从某个盒子开始,连续的拿走若干的盒子。问小偷从哪个盒子开始拿并且拿多少个盒子,才能使得到的收益最高。
输入描述
题目包含多组输入
n表示有n个盒子(n<=1000000),随后n个数表示每个盒子能带来的收益val,(-100<=val<=100)。
输出描述
输出两个值小偷拿的第一个盒子的位置i(从1开始数),拿走盒子的个数k。中间用空格隔开。如果有多种结果,要求在i尽量小的前提下k尽量大(因为小偷很贪心,
他总想多拿一点,当然知晓老龙王阴险的他也可以一个都不拿并输出"23333333")。
### 输入示例
5 -1 2 3 -2 4
### 输出示例
2 4
提示
选择 2 3 -2 4
思路:动态规划,(注意题目中的一字排列,连续的拿走盒子,从前往后不好破解,则考虑从后往前,dp[i]代表从第i个宝物往后取宝物,取得的最大价值,dp[i]的求法是取  本身的价值  和  本身价值加上后面盒子的已经获取的宝物  的最大值)从后往前,由后面的推出前面的 dp[i]=max(dp[i+1]+a[i]);注意细节的处理,

import java.util.Arrays;
import java.util.Scanner;

public class G {
    static int n;
    static int dp[]=new int[1000005];
    static int a[]=new int[1000005];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
          Scanner sc=new Scanner(System.in);
          while(sc.hasNext()) {
          n=sc.nextInt();
          int flag=0;
          for(int i=1;i<=n;i++)
        	  {a[i]=sc.nextInt(); 
        	   if(a[i]>=0) flag=1;
        	  }
          if(flag==0) {
        	  System.out.println("23333333"); //如果所有的宝物都为负值,则输出2333333并且不再执行以下程序,则用continue
        	  continue;
          }
          int max=0,ansi=0;
          for(int i=n;i>=1;i--)
          {
        	  dp[i]=Math.max(dp[i+1]+a[i], a[i]);
        	  if(dp[i]>=max) //要求i尽量小:因为是从后往前遍历,所以要取最靠前的i,因此应为dp[i]>=max而不是dp[i]>max;
        		  {
        		  max=dp[i];
        		  ansi=i;
        		  }
          }
          int count=0;
          int k,ansj = 0;
          for(k=ansi;k<=n;k++)
          {
        	  count+=a[k];
        	  if(count==max) ansj=k;//要求i尽量小的前提下k尽量大:因为是从前往后遍历,所以要取最靠后的k,而不能找出一个符合题意的k就行,要找出最靠右的符合题意的k
          }
          System.out.println(ansi+" "+(ansj-ansi+1));
	}

}}

要求在i尽量小的前提下k尽量大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值