江哥的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; }