dp

POJ 3181 Dollar Dayz 【完全背包】

*爱你&永不变心* 提交于 2020-01-10 22:24:51
题意: 给出两个数,n,m,问m以内的整数有多少种组成n的方法 完全背包+大数划分 思路: dp[i][j] := 用i种价格配出金额j的方案数。 那么dp[i][0] = 1,使用任何价格配出金额0的方案个数都是1(什么都不用)。 递推关系式: 实际上是完全背包问题,只是状态转移方程形式有所不同,不过状态转移的方向是完全相同的。 dp[i][j] = dp[i – 1][j] + dp[i – 1][j – i] + dp[i – 1][j – 2 * i] + … + dp[i – 1][0] 附: 01背包完全背包详解 #include <iostream> #include <cstdio> #include <string.h> #include <string> #include <algorithm> using namespace std; unsigned long long a[105][1005],b[105][1005],inf=1; int main() { int n,m,i; for(int i=0;i<18;i++) inf*=10; while(~scanf("%d%d",&n,&m)) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(i = 0;i<=m;i++) { a[i][0] = 1

BZOJ1076:[SCOI2008]奖励关

南楼画角 提交于 2020-01-08 21:11:57
1076: [SCOI2008]奖励关 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2696 Solved: 1419 [ Submit ][ Status ][ Discuss ] Description   你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关。在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃)。 宝物一共有n种,系统每次抛出这n种宝物的概率都相同且相互独立。也就是说,即使前k-1次系统都抛出宝物1( 这种情况是有可能出现的,尽管概率非常小),第k次抛出各个宝物的概率依然均为1/n。 获取第i种宝物将得到Pi 分,但并不是每种宝物都是可以随意获取的。第i种宝物有一个前提宝物集合Si。只有当Si中所有宝物都至少吃过 一次,才能吃第i种宝物(如果系统抛出了一个目前不能吃的宝物,相当于白白的损失了一次机会)。注意,Pi可 以是负数,但如果它是很多高分宝物的前提,损失短期利益而吃掉这个负分宝物将获得更大的长期利益。 假设你 采取最优策略,平均情况你一共能在奖励关得到多少分值? Input   第一行为两个正整数k和n,即宝物的数量和种类。以下n行分别描述一种宝物,其中第一个整数代表分值,随 后的整数依次代表该宝物的各个前提宝物

动态规划题目(C语言)

百般思念 提交于 2020-01-07 21:59:04
70 . 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/climbing-stairs int climbStairs(int n){ if(n==1)return 1; int dp[n+1]; dp[1]=1; dp[2]=2; for(int i=3;i<n+1;i++){ dp[i]=dp[i-1]+dp[i-2]; } return dp[n]; } 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 问总共有多少条不同的路径? 例如,上图是一个7 x 3 的网格。有多少可能的路径? 说明:m 和 n 的值均不超过 100。 示例 1:

Codeforces Round #597 (Div. 2)

本小妞迷上赌 提交于 2020-01-07 13:15:52
A.Good ol' Numbers Coloring 题目大意:如果涂成黑色块的块数无限,输出infinite,如果有限,输出finite。 分析:只用判断一下gcd是不是等于1,如果等于1,输出finite,如果不等于1,输出infinite。 代码: def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) t = input() t = int(t) for i in range(t): a, b = input().split() a = int(a) b = int(b) if gcd(a, b) == 1: print("Finite") else: print("Infinite") B.Restricted RPS 题目大意:石头剪刀布的游戏,一个人的出石头剪刀布的情况是已知的,另一个人是未知的,但是你知道另外一个人的出的次数的情况。让你找一种可以让那个人赢的情况,如果不能的话,输出NO,否则输出YES,并输出一种可行的方法。 分析:贪心即可,先尽量让第一个人赢,看看能赢不,再把剩下的往上添就好了。 代码: t = input() t = int(t) for i in range(t): n = input() n = int(n) a, b, c = input().split() a =

android屏幕显示相关字段的理解

亡梦爱人 提交于 2020-01-07 12:18:43
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、字段 1.density(密度): 描述设备屏幕一个区域内占用多少像素,不同的设备有不同的密度,是个概念名称,单位为dpi 2.dpi: dots per inch ,来表示某一英寸内的像素点,是密度的单位。一个设备可能支持多个分辨率,故dpi会根据像素变化(很多设备支持多分辨率切换) 3.px(像素) :屏幕基本单位 4.dp: Density-independent pixel根据设备的density的不同,计算后与px的比值为 px/dp=当前设备dpi/160 5.inch(英寸) :屏幕对角线长度,1 inch = 2.54cm 6.resolution(分辨率) :设备屏幕的总像素点 二、dp和px使用理解 网上看到大多数对dp理解文章,之前也非常笃信。后来实际开发中发现并不只如此。网上讲的大多只是初步一半的解释,仔细翻过api文档中的朋友会发现: Supporting Multiple Screens http://developer.android.com/guide/practices/screens_support.html 支持多个设备屏幕,不同设备有不同的density,dpi会随分辨率变化,dp比值也会变化。故网上大多数讲情景都是设备dp/px=dpi

BZOJ3992/LG3321 「SDOI2015」序列统计 DP+NTT

假如想象 提交于 2020-01-06 14:02:03
问题描述 小 C 有一个集合 \(S\) ,里面的元素都是小于 \(M\) 的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为 \(N\) 的数列,数列中的每个数都属于集合 \(S\) 。 小 C 用这个生成器生成了许多这样的数列。但是小 C 有一个问题需要你的帮助:给定整数 \(x\) ,求所有可以生成出的,且满足数列中所有数的乘积 \(\bmod M\) 的值等于 \(x\) 的不同的数列的有多少个。小 C 认为,两个数列 \(\{A_i\}\) 和 \(\{B_i\}\) 不同,当且仅当至少存在一个整数 \(i\) ,满足 \(A_i \neq B_i\) 。另外,小 C 认为这个问题的答案可能很大,因此他只需要你帮助他求出答案 \(\mod 1004535809\) 的值就可以了。 BZOJ3992 LG3321 题解 一道好题! 第一类部分分 - \(O(nm^2)\) \(\mathrm{DP}\) 设 \(dp[i][j]\) 代表选取了 \(i\) 个之后,膜 \(M\) 为 \(j\) 的方案数。 转移方程: \(dp[i][j]=\sum\limits_{k=1}^{|S|}{\sum\limits_{p=0}^{M-1}{dp[i-1][S_k \times p \bmod M]}}\) 边界条件: \(dp[1][j]=[j \in S]\)

LeetCode Hot-221最大正方形

心已入冬 提交于 2019-12-28 09:43:00
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4 动态规划 图来自leetcode官方解题 状态转移方程 dp(i, j)=min(dp(i−1, j), dp(i−1, j−1), dp(i, j−1))+1 代码 class Solution : def maximalSquare ( self , matrix : List [ List [ str ] ] ) - > int : if not matrix or matrix == [ [ ] ] : return 0 dp = [ [ 0 for _ in range ( len ( matrix [ 0 ] ) + 1 ) ] for _ in range ( len ( matrix ) + 1 ) ] max_len = 0 for i in range ( 1 , len ( dp ) ) : for j in range ( 1 , len ( dp [ i ] ) ) : if matrix [ i - 1 ] [ j - 1 ] == '1' : dp [ i ] [ j ] = min ( dp [ i - 1 ] [ j - 1 ] , dp [ i ] [ j

网络编程-upd\\Socket接收发送

那年仲夏 提交于 2019-12-25 11:43:02
import java.io.*; import java.net.*; public class first { public static void main(String[] args) { // TODO Auto-generated method stub MySend ms = new MySend(); MyRece mr = new MyRece(); Thread th1 = new Thread(ms); Thread th2 = new Thread(mr); th1.start(); th2.start(); } } class MySend implements Runnable { public void run() { DatagramSocket ds = null; try { ds = new DatagramSocket(8888); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 2 确定数据 、 封装成数据包 byte[] data = "udp ge men lai le ".getBytes(); DatagramPacket dp = null; try { dp = new

D - windy数 (数位DP)

人走茶凉 提交于 2019-12-24 00:03:03
D - windy数 windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 题解:用dp[i][j]表示对前i位,在第i+1位为j时的windy数 代码解释: /***********************************************/ int a[20]; ll dp[20][11];//记录前i位中windy数个数 //因为前一位j为多少对后面的枚举是有影响的 ll dfs(int cur,int pre,bool limit,bool lead) { //lead用于判断从高位到低位枚举时有没有前导0, //如对1232 //当前面几位枚举的都是0时,后面一位的枚举是不受前面一位限制的, //因为如果前面几位都是0,就相当于前几位是不存在的, //所以才有: if( abs(i-pre) >=2 || lead) //这就是枚举条件 if(cur==0) return 1; if(!limit && dp[cur][pre]!=-1 && pre>0) return dp[cur][pre]; // pre>0 ,如果pre==0,涉及到位数,需要再次循环 ll ans=0; int cu=limit?a[cur]:9; for(int

ZOJ 3469 Food Delivery

别说谁变了你拦得住时间么 提交于 2019-12-21 06:37:25
区间DP。 首先很容易想到送货顺序是起点不断向两边扩展的。这样可以用区间DP做。 但是,如果我们这样设计dp,dp[i][j][X]表示[i,j]这一段区间都送完,最终在左端点、右端点的最小花费,是 有后效性 的。 为什么有后效性? 如果有一种方案得到的dp[5][8][0]较小,但走的总路程较多,另一种得到的dp[5][8][0]较大,但是总路程很小, 这样不能确定哪一种往后推得到的答案更小! 正确的DP是这样设计的:dp[i][j][X]表示[i,j]这段区间都送完,最后在哪一个端点,对所有人造成的花费的最小值,即还要加上没有收到货物的那群人已经产生的花费。 状态转移方程很容易写: dp[st][en][0]=min(   dp[st+1][en][0]+abs(s[st+1].x-s[st].x)*(sum_now+s[st].b)*V,   dp[st+1][en][1]+abs(s[en].x-s[st].x)*(sum_now+s[st].b)*V ); dp[st][en][1]=min(   dp[st][en-1][1]+abs(s[en].x-s[en-1].x)*(sum_now+s[en].b)*V,   dp[st][en-1][0]+abs(s[en].x-s[st].x)*(sum_now+s[en].b)*V ); 注意:开longlong