動態規劃 活動選擇問題

2021-09-07 16:56:45 字數 825 閱讀 6490

乙個遞迴解

設c[i][j]為sij中最大相容子集中的活動數目,當sij為空集時,c[i][j]=0;當sij非空時,若ak在sij的最大相容子集中被使用,則則問題sik和skj的最大相容子集也被使用,故可得到c[i][j] = c[i][k]+c[k][j]+1。

當i≥j時,sij必定為空集,否則sij則需要根據上面提供的公式進行計算,如果找到乙個ak,則sij非空(此時滿足fi≤sk且fk≤sj),找不到這樣的ak,則sij為空集。

c[i][j]的完整計算公式如下所示:

最優解計算過程

根據遞迴公式,採用自底向下的策略進行計算c[i][j],程式實現如下所示:

#include using namespacestd;

const int n = 11; int s[n+2]= ; int f[n+2]= ; //trace[i][j]跟蹤子問題s(i,j)每次最優時的劃分 int trace[n+2][n+2]; //dp[i][j]表示子問題s(i,j)的最多相容活動數 int dp[n+2][n+2]; /*s(i,j)= } } } } } void print(int i,intj) intmain() cout<

執行結果:

動態規劃 活動選擇問題

乙個遞迴解 設c i j 為sij中最大相容子集中的活動數目,當sij為空集時,c i j 0 當sij非空時,若ak在sij的最大相容子集中被使用,則則問題sik和skj的最大相容子集也被使用,故可得到c i j c i k c k j 1。當i j時,sij必定為空集,否則sij則需要根據上面提...

活動選擇問題的動態規劃解

題目大意 dp方法解活動選擇問題 解題思路 s i,j 表示所有活動的集合,即活動ai和aj之間,所有與這兩個活動 相容的活動組成的子集。c i,j 表示該集合的大小。核心內容 對問題的建模,採用該模型分析既可以使用這種dp解決,也可以類似lis問題的dp解決,還可以 貪心解決。但是所有的這些都建立...

活動選擇問題 動態規劃 貪心演算法

問題描述 有乙個需要使用每個資源的n個活動組成的集合s 資源每次只能由乙個活動使用。每個活動ai都有乙個開始時間和結束時間,且 0 si fi 無窮 一旦被選擇後,活動ai就佔據半開時間區間 si,fi 如果 si,fi 和 sj,fj 互不重疊,則稱兩個活動是相容的。該問題就是要找出乙個由互相相容...