江哥的DP题(A)

【题目描述】

给定一个长度为N的序列A(A1、A2、A3、······、AN),取K个互不相同的元素,使得:

(1)两两元素互不相邻;

(2)元素之和最大。

【输入描述】

第一行输入两个正整数N、K;

第二行输入N个整数,表示序列A中的元素。

【输出描述】

输出一个整数,表示最大和。

【样例输入】

样例1:

7 3

3 5 7 -1 9 10 7

 

样例2:

7 3

3 21 7 -1 9 20 7

【样例输出】

样例1:

23

 

样例2:

40

【数据范围及提示】

对于30%的数据,K ≤ N ≤ 20;

对于100%的数据,K ≤ N ≤ 1000。

源代码:

#include<cstdio>
#include<algorithm>
#define LL long long //越来越喜欢吸long long。
using namespace std;
LL n,k,f[1001][1001][2]={0};
int main()
{
    scanf("%lld%lld",&n,&k);
    for (LL a=1;a<=n;a++)
    {
        LL t;
        scanf("%lld",&t);
        for (LL b=1;b<=k;b++) //似乎悟得了类背包问题的精髓。
        {
            f[a][b][0]=f[a-1][b-1][1]+t; //选。
            f[a][b][1]=max(f[a-1][b][0],f[a-1][b][1]); //不选。
        }
    }
    printf("%lld",max(f[n][k][0],f[n][k][1]));
    return 0;
}
posted @ 2016-10-30 19:33  前前前世。  阅读(198)  评论(0编辑  收藏  举报