首页 > 其他分享 >线性DP

线性DP

时间:2023-09-10 10:27:06浏览次数:32  
标签:int 31 DP 线性 include ll dp

DP三要素:状态,阶段,决策(转移)
阶段:第i层
状态:目前情况
写代码三要素:边界、目标、转移
DP要求:无后效性

Mr. Young's Picture Permutations

要求从左到右和从上到下都递减
首先肯定按顺序加入
从左到右很明确,加到最右边
从上到下怎么维护? 其实就是这一行加完之后不超过上一行就行
发现行数很少,直接变成状态
\(dp[b_1][b_2][b_3][b_4][b_5]\)表示第\(i\)行用了\(b_i\)个位置的方案
初始:\(dp[0][0][0][0][0]=1\)
转移:首先要不超范围,\(b_i<a_i\)

  1. 第\(1\)行随便加
  2. 对于第\(i\)行\((i\ne1)\) 要求\(b_i<b_{i-1}\)即可

开始感觉直接枚举是不是会漏因为阶段不是那么好处理,就写了bfs求dag
结果看了一下题解其实是可以直接枚举的,因为对于\(dp[b_1][b_2][b_3][b_4][b_5]\)
他的所有贡献来源其实都是有一维比他小的,在他被枚举到准备更新别人时,其实他已经是求完了

其他两个错误点:
1.unsigned int 直接int不能过 可以用 ll 但注意把所有涉及方案数的int改成ll!!(本题的x)
2. 直接开数组会MLE 因为下面的长度肯定小于上面的,所以第\(i\)行最多\(30/i\)个,节省空间

放一下bfs代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
using namespace std ;

typedef long long ll ;
const int N = 1000010 ;

struct node {
	int b1, b2, b3, b4, b5 ;
};

int n ;
int a[10] ;
ll dp[31][31 / 2 + 1][31 / 3 + 1][31 / 4 + 1][31 / 5 + 1] ;
int vis[31][31 / 2 + 1][31 / 3 + 1][31 / 4 + 1][31 / 5 + 1] ;
queue <node> q ;

void init() {
	memset(dp, 0, sizeof(dp)) ;
	memset(vis, 0, sizeof(vis)) ;
	memset(a, 0, sizeof(a)) ;
}

int main() {
	while (scanf("%d", &n) != EOF && n) {
		init() ;
		for (int i = 1; i <= n; i++) scanf("%d", &a[i]) ;
		dp[0][0][0][0][0] = 1 ; vis[0][0][0][0][0] = 1 ;
		q.push((node){0, 0, 0, 0, 0}) ;
		while (!q.empty()) {
			node t = q.front() ; q.pop() ;
			int b1 = t.b1, b2 = t.b2, b3 = t.b3, b4 = t.b4, b5 = t.b5 ;
			ll x = dp[b1][b2][b3][b4][b5] ;
			if (b1 < a[1]) {
				dp[b1 + 1][b2][b3][b4][b5] += x ;
				if (!vis[b1 + 1][b2][b3][b4][b5]) {
					q.push((node){b1 + 1, b2, b3, b4, b5}) ;
					vis[b1 + 1][b2][b3][b4][b5] = 1 ;
				}
			}
			if (b2 < a[2] && b2 < b1) {
				dp[b1][b2 + 1][b3][b4][b5] += x ;
				if (!vis[b1][b2 + 1][b3][b4][b5]) {
					q.push((node){b1, b2 + 1, b3, b4, b5}) ;
					vis[b1][b2 + 1][b3][b4][b5] = 1 ;
				}
			}
			if (b3 < a[3] && b3 < b2) {
				dp[b1][b2][b3 + 1][b4][b5] += x ;
				if (!vis[b1][b2][b3 + 1][b4][b5]) {
					q.push((node){b1, b2, b3 + 1, b4, b5}) ;
					vis[b1][b2][b3 + 1][b4][b5] = 1 ;
				}
			}
			if (b4 < a[4] && b4 < b3) {
				dp[b1][b2][b3][b4 + 1][b5] += x ;
				if (!vis[b1][b2][b3][b4 + 1][b5]) {
					q.push((node){b1, b2, b3, b4 + 1, b5}) ;
					vis[b1][b2][b3][b4 + 1][b5] = 1 ;
				}
			}
			if (b5 < a[5] && b5 < b4) {
				dp[b1][b2][b3][b4][b5 + 1] += x ;
				if (!vis[b1][b2][b3][b4][b5 + 1]) {
					q.push((node){b1, b2, b3, b4, b5 + 1}) ;
					vis[b1][b2][b3][b4][b5 + 1] = 1 ;
				}
			}
		}
		printf("%lld\n", dp[a[1]][a[2]][a[3]][a[4]][a[5]]) ;
	} 
}


标签:int,31,DP,线性,include,ll,dp
From: https://www.cnblogs.com/lighthqg/p/17690827.html

相关文章

  • 【LuoGu】2014 选课——树上DP
    [CTSC1997]选课题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有\(N\)门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有......
  • 什么是 SAP ABAP AMDP?
    SAPAMDP(ABAPManagedDatabaseProcedure)是SAP的一项先进技术,用于在SAPHANA数据库上执行高性能的数据库操作。它允许ABAP开发人员编写数据库过程,这些过程可以在数据库级别上执行,从而实现更快的数据处理和更高的性能。在本文中,我将详细解释SAPAMDP的概念、工作原理以及如何在ABA......
  • 10 UDP 聊天实现
    packageInternet;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetSocketAddress;//UDP实现聊天,两边都是发信方,也是收信方publicclassTest10_UDP_Me{pub......
  • C数据结构-线性表之顺序表
    什么是线性表线性表的插入元素线性表的删除元素线性表顺序存储的缺点线性表的特点1.线性表的实例首先我们创建3个文件,分别如下:liner_data--sqlist.c--sqlist.h--test.csqlist.h//.h文件中定位数据的结构以及函数的方法typedefintdata_t;#defineN128......
  • 9 UDP 消息发送
    没有客户端和服务端这一说法packageInternet;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketException;//UDP:类似发短信//发送端publicclassTest09_UDP_User1{publicstaticvoidma......
  • Ubuntu通过终端命令下载时提示“dpkg --configure -a......"
    如果之前在下载东西时,中途取消或中断可能会出现这种情况。结果 解决办法:在终端输入sudodpkg--configure-a ......
  • 机器学习算法原理实现——线性判别分析LDA
    介绍线性判别分析(LinearDiscriminantAnalysis,LDA)是一种有监督式的数据降维方法,是在机器学习和数据挖掘中一种广泛使用的经典算法。LDA的希望将带上标签的数据(点),通过投影的方法,投影到维度更低的空间中,使得投影后的点,按类别区分成一簇一簇的情况,并且相同类别的点,将会在投影后的......
  • UDP协议&&UDP广播通信
    UDP协议概念传输层主要的应用协议模型有,TCP,UDP两种。TCP协议占主导地位,绝大多数网络都是借助TCP协议完成数据传输,但UDP也是不了或缺的重要通信手段相较于TCP,UDP通信形式像发短信。不需要建立连接。只需要专心获取数据就可以,省去了三次握手,通信速度可以大大提高,伴随着通信的稳......
  • 状态压缩dp
    蒙德里安的梦想问题描述问题分析$f[i][j]=\displaystyle\sum_{0到1<<n-1中所有合法的k}(f[i-1][k])$$f[m][0]$的含义为前$m-1$列摆好,且从第$m-1$列伸出到第m列状态为$0$的方案数,显然这就是答案(原因见下图)$k$是否合法需要看$k$和$j$的关系,第一个条件表示第$i-2$列......
  • R语言分析糖尿病数据:多元线性模型、MANOVA、决策树、典型判别分析、HE图、Box's M检验
    全文链接:https://tecdat.cn/?p=33609原文出处:拓端数据部落公众号背景Reaven和Miller(1979)研究了145名非肥胖成年人的葡萄糖耐量和胰岛素血液化学指标之间的关系。他们使用斯坦福线性加速器中心的PRIM9系统将数据可视化为3D,并发现了一个奇特的图案,看起来像是一个有两个翼的大斑点......