首页 > 其他分享 >线性dp的反向思考

线性dp的反向思考

时间:2024-04-22 19:26:41浏览次数:27  
标签:非負 int 样例 leq 反向 倍数 入力 线性 dp

[ABC281D] Max Multiple

链接:https://www.luogu.com.cn/problem/AT_abc281_d

题面翻译

给定 \(n\) 个数。现在可以从中选 \(k\) 个数,需满足他们的和为 \(d\) 的倍数。求最大和值。

translated by @liangbowen

题目描述

非負整数列 $ A=(a_1,a_2,\ldots,a_N) $ が与えられます。

$ A $ の(添え字が相異なる) $ K $ 個の項の和として考えられる非負整数の集合を $ S $ とします。

$ S $ に含まれる $ D $ の倍数の最大値を求めてください。ただし、$ S $ に $ D $ の倍数が含まれない場合、代わりに -1 と出力してください。

输入格式

入力は以下の形式で標準入力から与えられる。

$ N $ $ K $ $ D $ $ a_1 $ $ \ldots $ $ a_N $

输出格式

答えを出力せよ。

样例 #1

样例输入 #1

4 2 2
1 2 3 4

样例输出 #1

6

样例 #2

样例输入 #2

3 1 2
1 3 5

样例输出 #2

-1

提示

制約

  • $ 1\ \leq\ K\ \leq\ N\ \leq\ 100 $
  • $ 1\ \leq\ D\ \leq\ 100 $
  • $ 0\ \leq\ a_i\ \leq\ 10^9 $
  • 入力はすべて整数

Sample Explanation 1

$ A $ から $ 2 $ 個の項を選ぶ方法を列挙すると - $ a_1 $ と $ a_2 $ を選ぶ。選ばれた項の和は $ 1+2=3 $ となる。 - $ a_1 $ と $ a_3 $ を選ぶ。選ばれた項の和は $ 1+3=4 $ となる。 - $ a_1 $ と $ a_4 $ を選ぶ。選ばれた項の和は $ 1+4=5 $ となる。 - $ a_2 $ と $ a_3 $ を選ぶ。選ばれた項の和は $ 2+3=5 $ となる。 - $ a_2 $ と $ a_4 $ を選ぶ。選ばれた項の和は $ 2+4=6 $ となる。 - $ a_3 $ と $ a_4 $ を選ぶ。選ばれた項の和は $ 3+4=7 $ となる。 となり、$ S={3,4,5,6,7} $ となります。$ S $ に含まれる $ 2 $ の倍数のうち最大のものは $ 6 $ なので、$ 6 $ と出力します。

Sample Explanation 2

この例では $ S={1,3,5} $ です。$ S $ に含まれる非負整数はいずれも $ 2 $ の倍数でないため、-1 と出力します。










解答

#include <iostream>
using namespace std;
typedef long long LL;
const int N = 110;
LL f[N][N][N];
LL a[N];
int n, k, d;

int main()
{
	cin >> n >> k >> d;
	for (int i = 1; i <= n; i++) cin >> a[i];

	memset(f, -1, sizeof f);
	f[0][0][0] = 0;
	for (int i = 0; i <= n; i++)
		for (int j = 0; j <= k; j++)
			for (int p = 0; p < d; p++)
			{
				if (f[i][j][p] == -1) continue;    //去除不可行的情况

				LL& v = f[i + 1][j + 1][(p + a[i + 1]) % d];
				v = max(v, f[i][j][p] + a[i + 1]);

				f[i + 1][j][p] = max(f[i + 1][j][p], f[i][j][p]);
			}

	cout << f[n][k][0] << endl;
	return 0;
}

标签:非負,int,样例,leq,反向,倍数,入力,线性,dp
From: https://www.cnblogs.com/xingzhuz/p/18151282

相关文章

  • hdparm安全擦
    hdparm是一个用于控制硬盘驱动器的命令行工具,它可以执行一系列的硬盘操作,包括安全擦除数据。以下是使用hdparm工具进行安全擦除的步骤:步骤1:安装hdparm(如果尚未安装)如果您的系统尚未安装hdparm,请使用适用于您的操作系统的包管理器进行安装。例如,在Ubuntu上,您可以使用以下......
  • 机器学习教程 一-不懂这些线性代数知识 别说你是搞机器学习的
    机器学习教程一-不懂这些线性代数知识别说你是搞机器学习的 原文:http://www.shareditor.com/blogshow/?blogId=1数学是计算机技术的基础,线性代数是机器学习和深度学习的基础,了解数据知识最好的方法我觉得是理解概念,数学不只是上学时用来考试的,也是工作中必不可少的......
  • LED车灯驱动DC-DC降压恒流芯片AP5174高效率线性调光IC摩托车电动车手电筒
    产品描述AP5174是一款效率高,稳定可靠的LED灯恒流驱动控制芯片,内置高精度比较器,固定关断时间控制电路,恒流驱动电路等,特别适合大功率LED恒流驱动。AP5174采用ESOP8封装,散热片内置接SW脚,通过调节外置电流检测的电阻值来设置流过LED灯的电流,支持外加电压线性调光,最大电......
  • 电动车摩托车灯DC-DC降压恒流芯片AP5170支持线性调光95%高效率IC
    产品描述AP5170是一款效率高,稳定可靠的LED灯恒流驱动控制芯片,内置高精度比较器,固定关断时间控制电路,恒流驱动电路等,特别适合大功率LED恒流驱动。AP5170采用ESOP8封装,散热片内置接SW脚,通过调节外置电流检测的电阻值来设置流过LED灯的电流,支持外加电压线性调光,最大电......
  • 使用ThreadPool.SetMinThreads方法提升API服务响应性能
     使用该方法的背景?某个API服务在每日请求量40W的情况下,流量增多时会产生大量请求异常:Theoperationwascanceled,从实际情况来看,并不是外部依赖接口或者服务实例不足导致,于是设置线程池数量后,服务性能提升效果显著。方法定义:设置线程池在新请求预测中维护的空闲线程数。pu......
  • 力扣周赛394之别样DP + 别样Dijkstra
    别样DP题目链接https://leetcode.cn/problems/minimum-number-of-operations-to-satisfy-conditions/description/题目大意题目思路需要考虑m列每一列填什么的情况,因为最终每一列都是一样的考虑暴力,每一列都可以变成0-9有\(10^m\)次种情况,这必然是不可行的我们从前往......
  • WPF relativesource,self,FindAncestor,AncestorType,AncestorLevel,PreviousData,Tem
    <Windowx:Class="WpfApp68.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com......
  • Python字节转换为字符串 - 如何将字符串转换为字节,以及反向转换
    你可以在Python中使用字节来表示二进制形式的数据。在本文中,你将学习如何将字节转换为字符串,以及反之亦然。在我们看转换之前,让我们谈谈Python中的字节是如何工作的。如果你已经理解了这一点,或者只是对转换感兴趣,你可以跳到下一节。(本文视频讲解:java567.com)Python中的字节是如......
  • UDP客户端和服务端的实现
    服务端的实现:publicclassUDPServer{publicstaticvoidmain(String[]args)throwsException{DateGramSocketsocket=newDateGramSocket(8888);//创建端口为8888的服务端byte[]b=newbyte[1024];//临时存放数据的包DateGramPacketp=newDateGramPacket(b,b.l......
  • dp 题 1
    T1Statement你需要将\(n(n\le10^6)\)个数的序列\(x\)划分成若干连续段,设其中一段的所有数之和为\(X\),那么这段的得分为\(Y=aX^2+bX+c\),其中\(a,b,c\)已知,求划分得到的最大总得分。\(-5\lea\le-1,|b|,|c|\le10^7,1\lex_i\le100\)。Solution设\(f_i\)表示前\(i\)......