LOJ 1017 普通dp

本文介绍了一种使用动态规划解决刷子覆盖最多点数问题的方法。通过定义dp[i][k]为第i个点被擦k次的情况,利用初始化和转移方程实现了最优解的求解。

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

题意:

给几个点,和一个一定宽度的刷子,在一定次数中,刷过最多的点的个数 。刷子可以水平无线延长刷。

题解:

dp[i][k] 第i个点,第k次刷,

初始化:    dp[ i ] [1]  第一次 刷 i 点,会~接下来~影响几个点。

转移:  dp[ i ][ k ] =max( dp[ i ] [ k ] ,dp[ i ][ 1 ] + dp[ j ][ k-1 ]);


#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=105;
int a[maxn];
int dp[maxn][maxn];//dp[i][k] 第i个点 擦k次 
int main()
{
	int T;int t;int cas=0;
	scanf("%d",&T);
	while(T--){
		int n,w,tim;
		scanf("%d%d%d",&n,&w,&tim);
		for(int i=1;i<=n;i++){
			scanf("%d%d",&t,&a[i]);
		}
		sort(a+1,a+n+1);
		int ans=0;
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++){//以i为底 
			for(int j=i;j<=n;j++){
				if(a[j]-a[i]<=w)
					dp[i][1]++;
			}
			ans=max(ans,dp[i][1]);
		}
		for(int i=1;i<=n;i++){// 去掉i 
			for(int k=2;k<=tim;k++){//擦k次 
				for(int j=1;j<i;j++){
					if(a[i]-a[j]>w)
						dp[i][k]=max(dp[i][k],dp[i][1]+dp[j][k-1]);
					else break;
				}
				ans=max(ans,dp[i][k]);
			}
		}
		printf("Case %d: %d\n",++cas,ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值