列表

详情


NC23976. 选择

描述

小猫在研究序列。小猫在研究选择。
给定一个长度为N的序列a1,a2,…,aN,请你在这N个元素中选出一些(可以不选,可以全选),使得对于任意1≤i<N,ai与ai+1不被同时选,求选出的数的和最大是多少。

输入描述

第一行一个正整数T,表示数据组数。每组数据的第一行一个正整数N。接下来一行N个正整数a1,a2,…,aN。

输出描述

T行,每行一个整数,表示每组数据的答案。

示例1

输入:

3
5
1 100 101 100 1
4
1 2 3 4
3
51 100 51

输出:

200
6
102

原站题解

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

C(clang 3.9) 解法, 执行用时: 4ms, 内存消耗: 276K, 提交时间: 2019-05-04 14:46:49

#include<stdio.h>
int max(int x,int y)
{
	return x>y?x:y;
}
int main(void)
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int a[101]={0},x,n,i;
		scanf("%d%d",&n,&x);
		a[1]=x;
		for(i=2;i<=n;i++)
		{
			scanf("%d",&x);
			a[i]=max(x+a[i-2],a[i-1]);
		}
		printf("%d\n",a[n]);
	}
	return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 5ms, 内存消耗: 396K, 提交时间: 2022-12-03 13:45:45

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

Python3(3.5.2) 解法, 执行用时: 40ms, 内存消耗: 7236K, 提交时间: 2020-01-18 18:20:50

n=int(input())
for i in range(n):
    m=int(input())
    sumls=[0 for i in range(m+1)]
    ls=list(map(int,input().split()))
    sumls[1]=ls[0]
    for j in range(2,m+1):
        sumls[j] = max(sumls[j - 1], sumls[j - 2] + ls[j-1])
    print(sumls[m])

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 348K, 提交时间: 2019-04-14 22:03:27

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int T,n,i,t,a[2],x;
	cin>>T;
	while(T--)
	{
		a[0]=a[1]=0;
		cin>>n;
		for(i=0;i<n;i++)
			cin>>t,x=max(a[0],a[1]),a[1]=a[0]+t,a[0]=x;
		cout<<max(a[0],a[1])<<endl;
	}
	return 0;
}

C++ 解法, 执行用时: 7ms, 内存消耗: 352K, 提交时间: 2021-07-16 14:17:13

#include<bits/stdc++.h>
using namespace std;
int n,T;
int main()
{	cin>>T;
	while(T--)
    {int dp[110]={0};
		cin>>n;
		for(int i=2,x;i<=n+1;++i)
		{
			cin>>x;
			dp[i]=max(dp[i-1],dp[i-2]+x);
		}
		cout<<dp[n+1]<<endl;
	}
	return 0;
}

上一题