【河南省多校脸萌第六场 E】2358:LLM找对象

本文解析了一道关于寻找最佳相识时机的算法题。题目要求在特定条件下找到最多可以认识的人数,采用动态规划的方法解决。输入包含相遇天数及不穿拖鞋的天数限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接 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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值