一类dp的网格模型

关于形如\(f_{i,j} = \sum_{t=1}^{|w|}\sum_{k=1}^{|v|}f_{i+w_t,j+v_k}\),其中\(w_t,v_k\)为一个定值的\(dp\)转移。
可以考虑放到坐标上,画出其转移路线,然后考虑组合意义。

Section1

求\(\sum_{i,j} \binom{a_i+b_i+a_j+b_j}{a_i+a_j}\),其中\(a,b\leq 4000,n\leq 10^6\)。

\(\binom{a_i+b_i+a_j+b_j}{a_i+a_j}\)等价于从\((-a_i,-b_i)\)走到\((a_j,b_j)\)的方案数。
建图后直接从左下往右上暴力\(dp\)出解。

Section2

定义一个\(n\)的排列合法,当且仅当:设\(n\)的位置为\(x\),有:
\[p_1<p_2<p_3....<p_{x-1}<p_x>p_{x+1}>....>p_{n-1}>p_n\]
有\(m\)个限制\((pos,v)\),形如\(p_{pos} = v\),
数据范围:\(m\leq n\leq 10^5\),求合法排列数。

考虑从小往大放,设\(f_{i,j}\)表示放完\(1,2...i\),左侧放了\(j\)个。
转移方程:\(f_{i,j} =f_{i-1,j-1} +f_{i-1,j}\)。
初始在\((0,0)\)每次放一个相当于移动\((+1,0)\)或\((+1,+1)\)。
限制相当于限制\(f_{v,j}\)必须通过特定方向到达该点。
而每一列最多就两个特殊点,直接对特殊点进行\(dp\),最后一列特殊处理一下即可。

Section3

[JLOI2015]骗我呢

考虑突变的位置,设\(f_{i,j}\)表示做到第\(i\)行,该行突变位置为\(j\)。
有:\(f_{i,j} = f_{i,j-1} +f_{i-1,j+1}\),其中\(f_{i,0} = f_{i-1,0}\)。
画出转移路线,把转移路线拽直可以发现,问题转化为:
从\((0,0)\)出发,到达\((n+m,n)\),且不经过\(y=x+2\)和\(y=x-(m+1)\)的方案数u。
容斥计算。

Section4

[NOI2018]冒泡排序

设\(f_{i,j}\)表示还剩下\(i\)个要放,前面的最大值为\(j\)的方案数。
显然当前点要么放比\(j\)大的数,要么放还没放的数中最下的那个。
由于我们是逆推所以:\(f_{i,j} = f_{i-1,j} + \sum_{k=j+1}^{n} f_{i-1,k} = \sum_{k=j}^n f_{i-1,k}\)。
考虑统计答案,枚举在哪个点\(i\)开始处于自由态。
由于不会放\(a_i\),而\(a_i\leq max_{pre}\),所以一定只能放比\(max_{pre}\)大的数。
此时的方案数为\(\sum_{k=max_{pre}+1}^n f_{n-i,k} = f_{n-i+1,max_{pre}+1}\)。
唯一的问题变为如何快速处理\(f\)。
显然合法的\(f_{i,j}\)需要满足\(j\ge n-i\),画出转移路线图,问题转化为:
从\((0,n)\)出发,不经过\(y=-x+(n-1)\)到达\((i,j)\)的方案数。
这是经典问题,答案为 \(\binom{i+n-j}{i} - \binom{i+n-j}{i+1}\)。

原文地址:https://www.cnblogs.com/GuessYCB/p/10228340.html

时间: 2024-07-30 03:29:39

一类dp的网格模型的相关文章

Direct-X学习笔记--封装一个网格模型类

之前学习了网格模型的导入,绘制,了解了X文件等相关知识,但是,那样绘制比较麻烦,而且绘制一个模型需要好多代码,完全是面向过程的思维,这次,学习一下怎么把网格模型的导入以及绘制等功能封装在一个类中.顺便加深一下对World Transform的理解.感觉自己的3D思维还是没有培养起来,想绘制一个对象,绘制出来和想象中的位置相差甚远. 一.复习一下网格模型相关知识 网格模型就是一个我们在美术工具中制作好的资源,通过一些API接口我们可以将美术童鞋做好的模型很方便的导入程序中.我们只需要了解怎样从文件

DP问题各种模型的状态转移方程 (转)

1(最长公共子串(注意和最长公共子序列区别)) 两个字符串str1和str2,长度分别为(l1,l2) dp[i][j]表示以两个字符串分别以第i和第j个字符结尾所能达到的公共子序列的长度,由于下面涉及到i-1和j-1,那么这个时候我们一般从i=1和j=1开始到i<=len1, j<=len2. if(str[i-1]=str[j-1]) dp[i][j]=dp[i-1][j-1]+1; if(str[i-1]!=str[j-1]) dp[i][j]=0; 0 ;              

[转]DP问题各种模型的状态转移方程

1(最长公共子串(注意和最长公共子序列区别)) 两个字符串str1和str2,长度分别为(l1,l2) dp[i][j]表示以两个字符串分别以第i和第j个字符结尾所能达到的公共子序列的长度,由于下面涉及到i-1和j-1,那么这个时候我们一般从i=1和j=1开始到i<=len1, j<=len2. if(str[i-1]=str[j-1]) dp[i][j]=dp[i-1][j-1]+1; if(str[i-1]!=str[j-1]) dp[i][j]=0; 0 ;              

VTK计算网格模型上的最短路径

Dijkstra algorithm to compute the graph geodesic.Takes as input a polygonal mesh and performs a single source shortest path calculation. Dijkstra's algorithm is used. 用鼠标右键拾取平面网格上的点,观察输出路径: #!usrbinenv python import vtk def loadSTL(filenameSTL): read

关于‘当前决策对未来“行动”的费用影响只与当前决策有关’这一类DP的理解,T:p2466

那么简单来说就是现在的决策内容会对之后的计算价值产生影响 那么我们怎么办:简单,如果这个影响是我们能够求的,那么我们就当前计算就好了! 1. 先把所有的点包括起点按 x 值排序,这样题目就变成从起点出发,每次可以 向左或向右走到最近的某个彩蛋,将其射落, 设每个彩蛋第一次走到的时刻为ti,答案就是∑max (yi - ti * vi) 2 很容易想到用 f[1][i][j]f[1][i][j].f[2][i][j]f[2][i][j]分别表示从起点出发已射落 i 到 j 这一段彩蛋,当前停留在

UE4的编程C++创建一个FPSproject(两)角色网格、动画、HUD、子弹类

立即归还,本文将总结所有这些整理UE4有关角色的网络格.动画.子弹类HUD一个简单的实现. (五)角色加入网格 Character类为我们默认创建了一个SkeletaMeshComponent组件,所以我们只须要做的就是使用哪一个静态网格模型.接下来我们为我们的FPSCharacter类创建一个蓝图,这样我们能够简单的把资源指定给静态网格模型这里,而且方便以后操作加入的组件. 作为開始,我们首先要导入一个第三人称的静态网格模型.最后我们设置成两个网格,一个是我们自己看的,另外一个是其它人看到的.

DP&amp;图论 DAY 3 上午

DP&图论  DAY 3  上午 状态压缩dp >状态压缩dp ?状态压缩是设计dp状态的一种方式.?当普通的dp状态维数很多(或者说维数与输入数据有关),但每一维总量很少是,可以将多维状态压缩为一维来记录.?这种题目最明显的特征就是: 都存在某一给定信息的范围非常小(在20以内),而我们在dp中所谓压缩的就是这一信息.?(或者是在做题过程中分析出了某一信息种类数很少)?我们来看个例子. >经典题?给出一个n*m的棋盘,要放上一些棋子,要求不能有任意两个棋子相邻.求方案数.? n<

HDU 2577 分情况多维DP

How to Type Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6787    Accepted Submission(s): 3057 Problem Description Pirates have finished developing the typing software. He called Cathy to test

区间dp的感悟

学区间dp似乎也很久了...对区间dp的通用模型都了解了一些 但是做题还是很坑 上了一点难度的题基本想不出什么思路.. 目前的做题方式就是看题 想一会发现自己不会做 看题解 好巧妙啊 理解后写一发.. 还是准备记载一下自己对区间dp的一点感悟 区间dp很多枚举区间长度的做法 一般是n^3 好像数据范围都不会太大的样子 问题和区间有关 或者加一个完成xx的状态 预处理比较重要 一般是在dp数组上搞事情 也有一些题是利用dp数组搞预处理 hdu2476 就是这样的 题目的套路和普通dp不太一样 感觉