zoukankan      html  css  js  c++  java
  • 江哥的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;
    }
  • 相关阅读:
    ASP.NET线程相关配置
    ECshop 数据库表结构
    PHPnow 升级后 PHP不支持GD、MySQL
    C# 创建iis站点以及IIS站点属性,iis不能启动站点
    CSPS_107
    CSPS_106
    CSPS_105
    CSPS_104
    CSPS_103
    CSPS_102
  • 原文地址:https://www.cnblogs.com/Ackermann/p/6013798.html
Copyright © 2011-2022 走看看