首页 > 其他分享 >P1077-DP【黄】

P1077-DP【黄】

时间:2023-11-12 16:56:50浏览次数:33  
标签:取模 int qua DP P1077 include spe dp

昨天好几道题没做出来很郁闷,结果今天上来半小时不到就直接做出一道黄DP题了,不错,又有写题的冲动了。
这道题我一直被那个“因为方案数可能很多,请输出方案数对 1000007取模的结果。”这句话吓到了,因为我在想如果涉及求最优方案,那么势必会有比较,那么既然取了摸还怎么比较啊?不会另要开一个数组记录每一个dp数组的值取过的有效模(即取模前后大小不一样就算是一次有效模)的数量吧,然后依照有效模数量和数值来比较,那也太麻烦了。而且昨天刚做题不顺很郁闷就不想写了。
但是突然意识到这道题求总方案数似乎并不需要涉及大小比较啊,就无脑的记忆化搜索把所需情况都加起来不就得了,每求一个加法都来一个取模运算,根本不用管那个取模的事情,毕竟只要让取模的题应该大概率都不需要比较,因为一旦需要比较就需要我上面想出来的那个方法来解决,这太麻烦了思维强度却不高,因而没有考核意义。
总之就是别做题前想着这个那个的,先写记搜的状态转移方程,然后在看到底能不能行,很多时候自己担忧的问题写出初步代码后就会发现其实没啥可担忧的根本不是问题,总之就是大胆的写起来。
顺便,此前一直不是很确定边界条件应该怎么搞,这道题让我想明白了——同样,先把记搜的状态转移写出来,然后自然而言就知道了到底是第一行、还是第一列、还是第一行和第一列需要设置边界条件、以及这个第一行和第一列是从下标0开始还是1开始等等等等,这些问题写出状态转移后自然非常清楚的看一眼便知。
就这样,上代码!

CODE

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <unordered_map>
#include <cmath>
#define int long long
using namespace std;

int dp[105][105],a[105],n,m;
int dfs(int spe,int qua)//species and quantity
{
	if(dp[spe][qua]!=-1)return dp[spe][qua];
	if(qua==0)return dp[spe][qua]=1;
	if(spe==1)
	{
		if(qua<=a[spe])
			return dp[spe][qua]=1;
		else
			return dp[spe][qua]=0;
	}
	//先写状态转移,再状态状态转移方程来发现我需要特设什么边界条件
	int DFS=0;
	for(int i=0;i<=a[spe];i++)
	{
		if(qua-i>=0)
			DFS=(DFS+dfs(spe-1,qua-i))%1000007;
	}
	return dp[spe][qua]=DFS;//需要取模大多不需要大小比较只需要加减法,因此别担心放心写就是了。
}

signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	memset(dp,-1,sizeof(dp));
	cout<<dfs(n,m)<<endl;
	/*
	cout<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			cout<<dfs(i,j)<<' ';
		cout<<endl;
	}*/
	return 0;
}

标签:取模,int,qua,DP,P1077,include,spe,dp
From: https://www.cnblogs.com/gongkai/p/17827387.html

相关文章

  • 区间DP
    一.定义即对于一个区间进行的dp二.经典转移方程1.枚举断点型f[l][r]=min(f[l][k-1],f[k][r])(l+1<=k<=r)2.左右端点型f[l][r]=min(f[l][r-1],f[l+1][r])3.有一定条件型f[l][r][k]=f[l][r-1][k-1]+f[r][r][0]三.主要思想1.遇到环时,破环为链,转化为区间求解2.区间由短到......
  • 树上动态DP状态设计及实现细节
    状态设计由于具有更改操作,我们希望更改后会变的东西可以简单的通过线段树上单点修改来维护。对于一般的常数层转移DP,这一点较好处理。但是对于树上DP,就需要结合重儿子进行设计另一个\(g\)数组,表示不含重儿子的DP值,就可以结合树剖快速计算。如这道,各点有不同代价,可覆盖子......
  • 斜率优化DP
    使用场景状态\(O(n)\),转移\(O(n)\),只涉及\(i,j\)两个未知量,\(j\)的取值范围的左、右端单调,可以把\(f_i\)当做截距维护上(max)、下(min)凸包。需要注意的是,它作用不仅仅可以优化DP,本质是求某些最值,\(\color{red}\text{example}\)。也可以在\(\color{pink}\text{一些题}\)中求......
  • G - Cut and Reorder 状压DP
    我是题目链接首先显然先一操作,然后二操作这样不会影响最终结果一眼状压DP,选出一些a从前往后塞,f[i][j]表示选出的a状态为i,且结尾为j时最小花费转移就看上一个状态的结尾(设为k)和当前结尾(设为j)在a里的下标是否顺着挨着(就是j=k+1),不是顺着挨着就要加个c这样会tle#include<bits/std......
  • 【小沐学前端】Windows下搭建WordPress(二、相关工具安装)
    1、简介WordPress是基于PHP和MySQL的免费开源内容管理系统(CMS)。它是全球使用最广泛的CMS软件,截至2019年5月,它为排名前1000万个网站中提供了超过30%的支持,并拥有在使用CMS构建的所有网站中,估计有60%的市场份额。2、搭建环境2.1Nginx配置nginx.conf,文件在nginx目录下的conf文件夹......
  • DP做题记录
    蒟蒻DP太菜了QAQ。一点体会:DP就是如何通过最少的信息确定最优解。P5664[CSP-S2019]Emiya家今天的饭思考了一下,发现第3个要求很难直接搞,于是考虑正难则反,用总方案数减去不符合要求的方案数。求总方案数:\(g_{i,j}\)表示在前\(i\)行中选\(j\)个点的方案数,则\[g_{i,j}=g_......
  • P3842-DP【黄】
    想搜索到最后一层,就必得先完成前面层的搜索任务,这构成了对状态转移的启示,即当前层的DP值应该是此前层转移过来后得到的最佳值。但这道题看数据范围应该不能用二维数组,抱着侥幸的心理我使用了动态二维数组,dpij表示以第i层第j个为终点时的答案,结果MLE了,喜提42分,详见CODE-1。后来意......
  • 状态机模型DP
    //http://ybt.ssoier.cn:8088/problem_show.php?pid=1302#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;intdp[N][3][3],n,w[N],t;intmain(){cin>>t;while(t--){cin>>n;intres=0;memset(......
  • [题解] AT_dp_w Intervals
    Intervals有\(m\)条形如\((l,r,a)\)的限制,表示如果\(s_{[l,r]}\)中有1就会有\(a\)的价值。你要求长度为\(n\)的01串的价值的最大值。\(n,m\le2\times10^5\)。将每个限制挂到右端点上,在右端点处计算贡献。然后我们就只关心最后一个1出现的位置了。......
  • 【小沐学前端】Windows下搭建WordPress(一、相关工具下载)
    1、简介WordPress是基于PHP和MySQL的免费开源内容管理系统(CMS)。它是全球使用最广泛的CMS软件,截至2019年5月,它为排名前1000万个网站中提供了超过30%的支持,并拥有在使用CMS构建的所有网站中,估计有60%的市场份额。1.1Nginxnginx[enginex]是一个HTTP和反向代理服务器,邮件代理......