题目链接 http://acm.nyist.me/JudgeOnline/problem.php?id=2358
题目描述
找对象可不是一件容易的事情,如果你想找个好对象啊,喜欢打游戏的得把游戏戒了,喜欢acm的得把acm戒了,然后“天将降女朋友于斯人也,必先看其有没有穿拖鞋”,现在LLM相中了N个妹子,他通过观星、占卜、杀队友祭天等方法终于发现了自己与这N个妹子分别
相遇的时间,但是LLM还是想穿拖鞋(但是穿了拖鞋就会情商急速下降找无法认识妹子),因此LLM决定忍痛割爱选择K天不穿拖鞋,但是不可以有任意两天连续不穿拖鞋,现在LLM问你他最多可以认识多少妹子
输入
每个测试文件包含不多于10组测试样例
每个测试样例第一行包含两个整数,N,K
接下来一行有N个数字,分别代表和第i个妹子相遇的是哪一天(这一天的编号小于100000000)
1<=N<=500,1<=K<=100000000
输出
输出包含一行,代表可以认识的妹子数量
样例输入
5 2
666 233 10086 233 10086
样例输出
4
提示
来源
河南省多校脸萌第六场
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define FIIL(a,b) memset(a,b,sizeof(a))
using namespace std;
int a[1100];
int v[2100];
int dp[1001][1001][2];
int main()
{
ios::sync_with_stdio(false);
int n,m;
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
int o=0;
FIIL(v,0);
FIIL(dp,-1);
//v[o]++;
for(int i=0;i<n;i++)
{
int j=i;
while(j+1<n&&a[i]==a[j+1]) j++;
if(i>0&&a[i]!=a[i-1]+1)
{
o++;
}
v[++o]=j-i+1;
i=j;
}
dp[0][0][0]=0;
dp[0][0][1]=0;
int ll=min(m,o);
for(int i=1;i<=o;i++) //第一次
for(int j=1;j<=ll;j++) //共计天
{
// if(j-1==0)
// {
// dp[i][j-1][0]= dp[i][j-1][1]=0;
// }
// else if(i-1==0)
// dp[i-1][j][0]= dp[i-1][j][1]=0;
//
if(dp[i-1][j-1][0]>=0)
{
dp[i][j][1]=max(dp[i-1][j-1][0]+v[i],dp[i][j][1]);
dp[i][j-1][0]=max(dp[i-1][j-1][0],dp[i][j-1][0]);
}
if(dp[i-1][j-1][1]>=0)
{
dp[i][j-1][0]=max(dp[i-1][j-1][1],dp[i][j-1][0]);
}
}
int ans=0;
for(int i=1;i<=ll;i++)
{
ans=max(ans,dp[o][i][0]);
ans=max(ans,dp[o][i][1]);
}
cout<<ans<<endl;
}
return 0;
}