poj 3046 dp(有重複元素的組合數)
題意:給出T種數字(1~T)。每種各有N[i]個。然後用這些數字構成的元素數量在a~b之間的組合數之和。
例如全集={1, 1, 2, 2, 3},即數字1和2出現兩次,數字3出現1次。
那麼元素數量為1的組合有3種: {1} {2} {3}
元素數量為2的組合有5種: {1,1} {1,2} {1,3} {2,2} {2,3}
元素數量為3的組合有5種: {1,1,2} {1,1,3} {1,2,2} {1,2,3} {2,2,3}
元素數量為4的組合有3種: {1,2,2,3} {1,1,2,2} {1,1,2,3}
元素數量為5的組合有1種: {1,1,2,2,3}
思路:動態規劃。dp[i][j]表示用1~i這些數字,元素數量為j的個數。那麼對每個dp[i][j],列舉數字i出現的次數即可求。複雜度為T*N(每種數字出現的最多次數,為100)*A(元素數量的上界)。這個地方可以優化到T*A,維護一個部分和即可。
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> using namespace std; #define INF 0x3fffffff #define clr(s,t) memset(s,t,sizeof(s)) #define N 100005 int dp[2][N],s[1005]; int n,m,be,en; int main(){ int i,j,now,a,b,res=0; scanf("%d %d %d %d",&n,&m,&be,&en); memset(s,0,(n+1)*sizeof(int)); for(i = 0;i<m;i++){ scanf("%d",&j); s[j]++; } dp[0][0] = 1; a = 1; b = 0; for(i = 1;i<=n;i++){ a = 1-a; b = 1-b; dp[b][0] = now = 1;//now是部分和 for(j = 1;j<=en;j++){ if(j<=s[i]) now += dp[a][j]; else now += dp[a][j]-dp[a][j-s[i]-1]+1000000; now %= 1000000; dp[b][j] = now; } } for(j = be;j<=en;j++){ res += dp[b][j]; res %= 1000000; } printf("%d\n",res); }
相關推薦
poj 3046 dp(有重複元素的組合數)
題意:給出T種數字(1~T)。每種各有N[i]個。然後用這些數字構成的元素數量在a~b之間的組合數之和。 例如全集={1, 1, 2, 2, 3},即數字1和2出現兩次,數字3出現1次。 那麼元素數量為1的組合有3種: {1} {2} {3} 元素數量為2的組合有5種:
POJ 3046 Ant Counting——多重集組合數
定義dp【i】【j】為從前i種物品中選j個物品對應的方案總數 狀態轉移方程為:dp【i】【j】 = ∑dp【i-1】【j-k】(k的範圍是【0,min(j,cnt【i】)】) 優化的話只要寫出dp【i】【j】和dp【i】【j-1】對應的求和展開式就能找到兩者之間的關係,從而
js判斷數組裡是否有重複元素的方法
// 方法一,正則判斷------本人已經測試過,其他的沒有測試過。 var ary = new Array("111","ff","222","aa","222"); alert(mm(ary)) // 驗證重複元素,有重複返回true;否則返回false function mm(a) { retu
poj-3046-dp
real HA mis hat sibling .org november order arc Ant Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6829 Ac
子集生成之增量構造法(允許有重複元素)
假設集合S中有n個元素,它的子集的元素個數可以為1至n個,這個問題等價於有n個桶,按順序擺好並編號0~n-1,然後我們依次走到這n個桶面前,此時我們可以決定不放元素,或者放一個元素,因為集合是無序的(集合{1,2,3}和{2,1,3}相同),所以我們可以事先將S中的元素排序,這樣我們走到編號為s
有重複元素的組合
字典序從小到大 #include<cstdio> #include<algorithm> using namespace std; bool vis[30]; int n,r,arr[30],a[30],had; bool check(int now) {
Leetcode|Find Minimum in Rotated Sorted Array II(有重複元素的二分查詢)
Follow up for “Find Minimum in Rotated Sorted Array”: What if duplicates are allowed? Would this affect the run-time complexity? How and why?
【Paths on a Grid】【POJ - 1942 】(高精度組合數)
題目: Imagine you are attending your math lesson at school. Once again, you are bored because your teacher tells things that you already mastered ye
檢查一個列表是否有重複元素
《像電腦科學家一樣思考Python》第10章練習10-7 編寫一個名為has_duplicates的函式接收一個列表,當其中任何一個元素出現多於一次時返回True。 它不應當修改原始列表。 ※自己實現的程式碼(用while迴圈) def has_duplicates
有重複元素的全排列
題目描述 集合S中有n個元素,其中的元素可能重複,設計一個演算法,計算出S的不同排列字元全部由小寫字母組成, 輸出按照字典序輸出 n <= 9 輸入 第一行一個整數n 第二行一個字串包含n個字母 輸出 所有的全排列 最後一行輸出個數 樣例輸入 4 aacc
P1691 有重複元素的排列問題 (模擬全排列)
題目描述 設R={r1,r2,……,rn}是要進行排列的n個元素。其中元素r1,r2,……,rn可能相同。使設計一個演算法,列出R的所有不同排列。 給定n以及待排列的n個元素。計算出這n個元素的所有不同排列。 輸入輸出格式 輸入格式: 第1行:元素個數n(1&l
[科技部與你共成長] 判斷陣列中是否有重複元素
給定一個長度為N的陣列,其中每個元素的取值範圍都是1到N。判斷陣列中是否有重複的數字。(原陣列不必保留) 這個題有多種方法,想想看~~~ ------------------------------------------------------------------------
隨筆-尋找旋轉排序陣列中的最小值(有重複元素)
題目: 假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。 請找出其中最小的元素。 注意陣列中可能存在重複的元素。 示例 1: 輸入: [1,3,5] 輸出: 1
有重複元素的排列問題//利用全排列函式
題目描述 設R={r1,r2,……,rn}是要進行排列的n個元素。其中元素r1,r2,……,rn可能相同。使設計一個演算法,列出R的所有不同排列。 給定n以及待排列的n個元素。計算出這n個元素的所有不同排列。 輸入輸出格式 輸入格式: 第1行:元素個數n(1<=n&
java 實現從無序陣列中 找出第k大的數, 無序陣列充許有重複元素
要求找出第幾名的元素是什麼(找出B[i]的值)? 找出第k名的元素的值。 先從A中隨機一個下標index1, 然後進行一趟快速排序等到新陣列A1,排完了就知道index1對應的元素在A1中的新下標index2. 如果k等於index2,則A1[index2]就是要找的值。 如果 k小於in
iOS開發之判斷陣列中是否有重複元素
######法一: NSMutableDictionary *dic = [NSMutableDictionary dictionary]; for (NSNumber *number in arr) { [dic setObject:n
演算法分析之有重複元素的排列問題O(n!)
#include<iostream> #include<vector> #include<algorithm> using namespace std; template<class eT> void quicksort(v
python實現給定一個列表判斷裡面是否有重複元素
題目很簡單,只是簡單溫習一個方法,most_common,這是collection模組中Counter類的方法,具體方法用法可以去查 下面是簡單的實現: #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城
演算法筆記 //05_有重複元素的排列問題(針對字母排序)
★問題描述: 設 R = { r1, r2, ……, rn } 是要進行排列的 n 個元素。其中元素 r1 ,r2 ,……,rn 可能相同。試設計一個演算法,列出 R 的所有不同排列。 給定 n 以及待排列的 n 個元素。計算出這 n 個元素的所有不同排列。
POJ 3046 Ant Counting(dp—多重集組合數問題)
Ant Counting Time Limit:1000MS Memory Limit:65536K Total Submissions:3753 Accepted:1475