1628: 龙宫盗宝 动态规划

描述

老龙王酷爱收藏宝贝,他搜罗了很多宝贝藏在他的龙宫之中。某日一小偷潜入龙宫之中企图盗窃龙宫宝物。假设宝物是被一字排列的,每个宝物都装在一个盒子里,老龙王在某些盒子里设计了一些陷阱。小偷如果拿到装有宝物的盒子,则会获得一定的收益,如果盒子里有陷阱则会有一定的损失。小偷为了尽快的拿走宝物而不被发现,决定从某个盒子开始,连续的拿走若干的盒子。问小偷从哪个盒子开始拿并且拿多少个盒子,才能使得到的收益最高。

输入描述

题目包含多组输入

n表示有n个盒子(n<=1000000),随后n个数表示每个盒子能带来的收益val,(-100<=val<=100)。

输出描述

输出两个值小偷拿的第一个盒子的位置i(从1开始数),拿走盒子的个数k。中间用空格隔开。如果有多种结果,要求在i尽量小的前提下k尽量大(因为小偷很贪心,他总想多拿一点,当然知晓老龙王阴险的他也可以一个都不拿并输出"龙宫如此之穷")。

输入示例

5 -1 2 3 -2 4

输出示例

2 4

提示

选择 2 3 -2 4

/*未过
========[7.out]=========
Expected						      |	Yours
12 3							      \	3 1

==============================
========[6.out]=========
Expected						      |	Yours
222052 11923						      \	4792 2083

==============================
*/
#include<iostream>
#include<cstdio>
using namespace std;
int n,v;
int st,k,Max,fst,fk;
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        st=1;k=0;Max=-1;//
        fst=0;fk=0;
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&v);
            sum+=v;
            k++;
            if(sum>Max)
            {
                Max=sum;
                fst=st;
                fk=k;
            }
            else if(sum==Max)
            {
                if(fst==st)
                    fk=k;
                else if(k>fk)
                {
                    fst=st;
                    fk=k;
                }   
            }
            if(sum<0)//
            {
                st=i+1;
                k=0;
            }
        }
        if(fst==0&&fk==0)printf("23333333");
        else
        printf("%d %d\n",fst,fk);
    }
    return 0;
}
//ac
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1E6+10;
int n,num[N];
int dp[N];
int main(){
	while(cin>>n){
		int f = 0; 
		for(int i=1;i<=n;i++){
			scanf("%d",&num[i]);
			if(num[i] >= 0)f = 1;
		}
		if(!f){
			printf("23333333\n"); //10%是错在这里,题面忘记改了不好意思啊
			continue;
		} 
		memset(dp,0,sizeof dp);
		int ansi,ansk;
		int maxn = -100;
		for(int i=n;i>=1;i--){
			dp[i] = max(dp[i+1]+num[i],num[i]);
			if(dp[i] >= maxn){
				maxn = dp[i];
				ansi = i;
			}
		}
		int sum = 0;
		for(int i=ansi;i<=n;i++){
			sum += num[i];
			if(sum == maxn){
				ansk = i;
			}
		}
		printf("%d %d\n",ansi,ansk - ansi + 1);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40367307/article/details/88426903