1. 程式人生 > >動態規劃第4講——計數問題中的DP演算法

動態規劃第4講——計數問題中的DP演算法


DP不僅廣泛用於各種最優化問題,也常常用於排列組合的個數、概率期望計算等等,因為這些問題往往具有很好的“ 重疊子問題”特性,這些問題往往都起源於排列組合中的組合公式A(n, k) = A(n-1, k) + A(n-1, k-1)

例一:求解劃分數

有n個無差別的物品,將他們劃分成不超過m組,求劃分方法數除以M的餘數。

分析:dp[i][j]j的i劃分的總數
dp[i][j] = dp[i][j-i] + dp[i-1][j] 物理意義:將j個物品分成i份,有兩種情況:每份劃分都大於等於1 dp[i][j-i]; 存在有一份以上用0劃分dp[i-1][j]


例二:有n種物品,第i種有a[i]個,從中選取m個,有多少種不同的選擇方法?

dp[i+1][j]:從[0, i]號物品中選取j個物品的方法。
dp[i+1][j] = dp[i][j] + dp[i+1][j-1]
這是我們很直觀想到的一個遞推關係:dp[i][j]:從i號物品中選0個, dp[i+1][j-1]從i號物品中至少選擇1個
實際上,由於是多重集而不是完全集合,因為我們已經選取了一個i號物品,所以dp[i+1][j-1]表示的不是從i號物品中選擇至少一個的數目,因為dp[i+1][j-1]包含了選取a[i]個i號物品,而實際上,這種情況是因該去掉的(因為i號物品的數量已經是a[i]-1了)。so, 結果的基礎上,需要減去dp[i][j-a[i]-1],也就是
dp[i+1][j] = dp[i][j] + dp[i+1][j-1] - dp[i][j-1-a[i]];

相關推薦

動態規劃4——計數問題DP演算法

DP不僅廣泛用於各種最優化問題,也常常用於排列組合的個數、概率期望計算等等,因為這些問題往往具有很好的“ 重疊子問題”特性,這些問題往往都起源於排列組合中的組合公式A(n, k) = A(n-1, k) + A(n-1, k-1) 例一:求解劃分數 有n個無差別的物品,將

韓順平 servlet 筆記 4

pri 拷貝 添加 分頁技術 希望 int 列表 top ima 1、顯示圖片   在你的webApps(即你的目錄下,建立一個文件夾,比如imags),然後將圖片拷貝到文件夾下,在servlet中添加:<img src = ./imgx/圖片名>即可:   p

第二課:402_04_Linux文件管理命令詳解

cfile hive dir 文件管理命令 linux文件管理 direct sta director 屬性。 第二課:第4講02_04_Linux文件管理命令詳解1.cp copycp SRCFILE DSET cp file1 f2 f3一個文件到一個文件多個文件到一個

[bzoj1084][SCOI2005]最大子矩陣_動態規劃_偽·輪廓線dp

cst 動態規劃 時間復雜度 oid 子矩陣 。。 敬畏 版本 我們 最大子矩陣 bzoj-1084 SCOI-2005 題目大意:給定一個n*m的矩陣,請你選出k個互不重疊的子矩陣使得它們的權值和最大。 註釋:$1\le n \le 100$,$1\le m\le 2

【學習筆記】 唐大仕—Java程式設計 4 類、包和介面之4.2 類的繼承

【學習筆記】 唐大仕—Java程式設計 第4講 類、包和介面之4.2 類的繼承 super的使用 1.使用super訪問父類的域和方法 注意:正是由於繼承,使用this可以訪問父類的域和方法。但是有時為了明確指明父類的域和方法,就要用關鍵字super。this和super都是指當前同一個物件

【學習筆記】 唐大仕—Java程式設計 4 類、包和介面之4.4 訪問修飾符

修飾符(modifiers) 訪問修飾符(access modifiers) 如public/private等 其他修飾符 如abstract等 可以修飾類、也可以修飾類的成員(欄位、方法)   同一個類中 同一個包中 不同包中的子類

【學習筆記】 唐大仕—Java程式設計 4 類、包和介面之4.6 介面

【學習筆記】 唐大仕—Java程式設計 第4講 類、包和介面之4.6 介面 介面(interface) 介面,某種特徵的約定 定義介面interface  所有方法都自動是public abstract 實現介面implements  可以實現多繼承  與類的繼承關係無關 面向介面程式設計,而不

4.4-常用命令

常用命令 1.linux執行級別 -** 3號執行級別用的是最多的,一般公司做伺服器的時候會設為3號執行狀態;** -常用的是3號和5號級別; -修改檔案中的一句話去更改執行級別;‘ /etc/inittab 解決修改錯誤配置的方法 -在進入grub引導介面時,請輸入e; -選

JVM系列4:從原始碼到機器碼,發生了什麼?

在上篇文章我們聊到,無論什麼語言寫的程式碼,其到最後都是通過機器碼執行的,無一例外。那麼對於 Java 語言來說,其從原始碼到機器碼,這中間到底發生了什麼呢?這就是今天我們要聊的。 如下圖所示,編譯器可以分為:前端編譯器、JIT 編譯器和AOT編譯器。下面我們逐個講解。 前端編譯器:原始碼到位元組碼

03 struts2ActionSupport引入

1,在專案 HeadFirstStruts2chapter02 中,新建HelloWorldAction.java,繼承ActionSupport類,package com.cruise.action;import com.opensymphony.xwork2.ActionSu

14 struts2struts.xml的標籤配置

1複製專案,HeadFirstStruts2chapter02_06 改名:HeadFirstStruts2chapter02_07,同時修改web project settings 2修改HelloAction,name屬性,get() set()方法,package com.cruis

4. ElasticSearch安裝head

1,安裝nodejs,參考:http://www.cruiseloveashley.com/news/?7906.html2,root使用者安裝git, 命令列,yum  install -y git 測試:git --version 測試, 3, root使用者下載head外掛,

4 .Freemarker和ajax請求 Springboot

一:使用freemarker,頁面請求 1.新增jar包,     開啟eclipse, 開啟專案的pom檔案,Alt+/ 選擇 搜尋 Configuration Processer,和 Freemarker,並勾選, 選擇ok,如圖;或者 新增 如下:

PC逆向之程式碼還原技術,彙編減法的程式碼還原

目錄 PC逆向之程式碼還原技術,第四講彙編中減法的程式碼還原 一丶彙編簡介 二丶高階程式碼對應彙編觀看. 1.程式碼還原解析: 三丶根據高階程式碼IDA反彙編的完整程式碼 四丶知識總結 PC逆向之程式碼還原技術,第四

Leetcode題解之動態規劃4)最大子序和打家劫舍

題目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/23/dynamic-programming/57/ 題目描述: 打家劫舍 你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有

《數字影象處理》4——線性運算與空間影象增強

雖然寫這個部落格主要目的是為了給我自己做一個思路記憶錄,但是如果你恰好點了進來,那麼先對你說一聲歡迎。我並不是什麼大觸,只是一個菜菜的學生,如果您發現了什麼錯誤或者您對於某些地方有更好的意見,非常歡迎您的斧正! 目錄 4.1線性系統 ❶性質 ❷線性移不變系統(時不變系統) 4.2

4 如何做好向上溝通?

曾經對超過50位技術管理者進行過調查,統計結果顯示,向上溝通上技術管理者們最挑戰的管理主題之一。具體是哪些事情,讓管理者們感到都痛呢?發現以下四類問題最為普遍。 第一類:和上級能不聊就不聊。主要說法有: 1)上級太忙了,我的事情好像沒有那麼重要,等他閒了再說吧 2)找不到上級,他很少在工

動態規劃專題(二)——樹形DP

前言 DPDPDP這東西真的是博大精深啊… 簡介 樹形DPDPDP,顧名思義,就是在樹上操作的DPDPDP,一般可以用fif_ifi​表示以編號為iii的節點為根的子樹中的最優解。 轉移的時候一般都將

動態規劃專題(三)——數位DP

前言 數位DPDPDP 真的是最噁心的DPDPDP。 簡介 看到那種給你兩個數,讓你求這兩個數之間符合條件的數的個數,且這兩個數非常大,這樣的題目一般就是 數位DPDPDP 題。 數位DPDPDP一般

14 struts2struts.xml的標籤配置

1複製專案,HeadFirstStruts2chapter02_06 改名:HeadFirstStruts2chapter02_07,同時修改web project settings 2修改HelloAction,name屬性,get() set()方法,package co