列表

详情


NC206571. 最大的收益

描述

一天,上课的时候小L老师带来一些食物,要把它分给同学们品尝,于是这些食物被分成了n堆。每一堆都给它标注了一个价值。
小L老师就问同学们如何选择品尝的顺序使得品尝的价值之和最大。聪明的你立马就想到了把所有的食物品尝一遍价值和就是最大。
这时小L老师立马加了一个规矩不能品尝相邻的两种食物,例如食物A B C依次摆放着桌子上,当你品尝了食物A 你就不能品尝食物B。
下一个品尝的食物只能是C。当你品尝了食物B,你就不能品尝食物C,同时也不能品尝食物A。聪明的你知道如何选择使得你从左到
右选择品尝的食物的价值最大嘛!最大的价值是多少。

输入描述

第一行一个整数T(1≤T≤500),表示共有T组测试数据。
对于每组数据,第一次一个数字n(1≤n≤1000)表示有n堆食物接下来一行有n个数,分别表示每堆食物的价值ai (0≤ai≤100).

输出描述

输出一个整数代表所能获得的最大价值

示例1

输入:

2
4
1 2 3 4
3
2 3 0

输出:

6
3

说明:

样例一 选择品尝第二个和第四个食物获得的价值总和最大为6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.5.2) 解法, 执行用时: 31ms, 内存消耗: 3436K, 提交时间: 2020-06-07 12:52:26

t = int(input())
while t>0:
    t-=1
    n = int(input(""))
    arr = input()
    num = [int(n) for n in arr.split()]
    if n==1:
        print(num[0])
    else :
        lis = []
        f = 2
        lis.append(num[0])
        lis.append(max(num[0],num[1]))
        while f<n:
            lis.append(max(num[f]+lis[f-2],lis[f-1]))
            f+=1
        print(lis[n-1])

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 584K, 提交时间: 2020-06-08 15:34:41

#include<stdio.h>
#include<string.h>
int main()
{
	int n,i,j,m,m1,m2,a[10000],b[1000];
	scanf("%d\n",&n);
	while(n--)
	{
		m1=0;
		a[0]=0;
		scanf("%d",&m);
		for(i=1;i<=m;i++)
		scanf("%d",&a[i]);
		for(i=2;i<=m;i++)
		a[i]=a[i-1]>a[i-2]+a[i]?a[i-1]:a[i-2]+a[i];
		printf("%d\n",a[m]);
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 492K, 提交时间: 2020-06-07 13:25:57

#include<iostream>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,a[101],i,j,dp[101];
		cin>>n;
		for(i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		dp[0]=0;
		dp[1]=a[1];
		for(i=2;i<=n;i++)
		{
			dp[i]=max(dp[i-2]+a[i],dp[i-1]);
		}
		cout<<dp[n]<<endl;
	}
}

上一题