新生多校第6场 LLM找对象(DP+离散化)


题解:

dp[i][j][0]:前i天已经j天不穿拖鞋且第i天穿了拖鞋的最大值

dp[i][j][1]:前i天已经j天不穿拖鞋且第i天没穿拖鞋的最大值

状态转移:

dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]);

dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-1][0]+d[i]);(d[i]表示第i天有多少个妹子)

#include<set>
#include<map>       
#include<stack>              
#include<queue>              
#include<vector>      
#include<string>    
#include<math.h>     
#include<stdio.h>              
#include<iostream>              
#include<string.h>              
#include<stdlib.h>      
#include<algorithm>     
#include<functional>      
using namespace std;
typedef long long ll;
#define inf  1000000000         
#define mod 1000000007               
#define maxn  1705   
#define PI acos(-1.0) 
#define lowbit(x) (x&-x)   
#define eps 1e-9  
int dp[maxn][maxn][2], a[maxn*100], b[maxn*100], c[maxn*100], d[maxn*100];
int main(void)
{
	int n, k, i, j, cnt, p;
	while (scanf("%d%d", &n, &k) != EOF)
	{
		cnt = 0;p = 1;
		memset(a, 0, sizeof(a));
		memset(c, 0, sizeof(c));
		memset(d, 0, sizeof(d));
		memset(dp, 0, sizeof(dp));
		for (i = 1;i <= n;i++)
			scanf("%d", &a[i]), b[i] = a[i];
		k = min(k, n);
		sort(b + 1, b + n + 1);
		int num = unique(b + 1, b + n + 1) - b - 1;
		c[1] = b[1];cnt = 1;
		for (i = 2;i <= num;i++)
		{
			if (b[i] - b[i - 1] > 1)
				c[++cnt] = b[i] - 1;
			c[++cnt] = b[i];
		}
		for (i = 1;i <= n;i++)
			a[i] = lower_bound(c + 1, c + cnt + 1, a[i]) - c;
		sort(a + 1, a + n + 1);
		for (i = 1;i <= max(n, cnt);i++)
			d[a[i]]++;
		for (i = 1;i <= max(cnt, n);i++)
		{
			for (j = 1;j <= k;j++)
			{
				if (j > i)
					break;
				dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][1]);
				dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - 1][0] + d[i]);
			}
		}
		int ans=0, tmp;
		for (i = 0;i <= k;i++)
		{
			tmp = max(dp[max(n, cnt)][i][1], dp[max(n, cnt)][i][0]);
			ans = max(ans, tmp);
		}
		printf("%d\n", ans);
	}
	return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,否则可能会出现解析不了的错误,建议解压重命名为英文名字后再运行!有问题私信沟通,祝顺利! 基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值