題意:複製人有n個屬性,給出每個屬性的最大值,屬性值的範圍從0到最大值。如果a的所有能力值比b低,那a不能存活。問,最多可以有多少人存活。
思路:看了離散的偏序,重新寫一下吧。
首先,a的能力值比b高,這個就定義了乙個偏序關係。 而能夠共存的人,就是對應了一條反鏈(即,相互之間不能比大小)。
根據dilworth定理,最大反鏈的大小等於最小的鏈的個數,使這些連覆蓋所有的點。
我們就要找到整個圖中最大的寬度。
這個有點類似於擲幾個篩子,求這些色子點的和的最大概率,整個方案分布類似有二項分布或正太分布,那麼方案數的最大值是在中位數中取到。
我們能有dp方程求出前i個屬性,和為j的方案數。那麼最後的答案就是dp[n][sum/2];
**如下:
#include #include #include using namespace std;
const int max = 3000;
const int mod = 1e9 + 7;
int t,n;
int sum;
int dp[max][max];
int t[max];
int main(void)
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i = 0 ; i < n; ++i)
for(int j = 0; j <=sum; ++j)
for(int k = 0; k <= t[i]; ++k)
dp[i+1][j+k] = (dp[i+1][j+k] + dp[i][j]) % mod;
printf("%d\n",dp[n][sum / 2]);
}return 0;
}
HDU 5000 Clone (多重揹包)
題目 題意 有乙個人他可以轉殖自己,但轉殖出來的自己並不完全一樣。對於每兩個自己,a和b,他會看n個屬性,如果b的每一項屬性都比不過a,那麼b就不能存在。每乙個屬性的評分範圍為0 t i 問最多能存在多少個他自己。思路 對於可以同時存在的兩個人,假如有3個屬性 a1 b1 c1 a2 b2 c2 如...
hdu 5000 共存問題 揹包
每只羊有n個屬性 下面n個數字表示每個屬性的值範圍為 0,t i 對於羊圈裡的a羊和b羊,若a羊的每個屬性都 b羊,則a羊會殺死b羊。問羊圈裡最多存活多少隻羊。sum相同的羊不會互相殺死。sum不同的羊不會重合。我們設a羊sum x,b羊sum y,若a,b羊能共存,但不會把ab同時放到羊圈裡。因為...
列舉 hdu1172 猜數字
因為時間給的非常多,然後測試組數又很小,所以是乙個很粗暴的模擬 只要從1000到9999列舉答案,然後再判斷符合答案的個數,看個數的數量差不多就做完了 然後就在於如何判斷有幾個數字同時存在,我的思路是用vis1和vis2分別記錄進行比較的兩個數字中,每個數字出現的次數 那麼如果對於某個數字,vis1...