hdu 2372 El Dorado (dp)
题意:给n个数字, 求有k个数字的上升子序列有多少种。
思路:d[i][j]表示 以第i个元素为 子序列的最后一个元素,长度为j的子序列 有多少种。
比赛的时候 光想着用组合数做了。。。。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 const int maxn = 110; 8 9 __int64 d[maxn][maxn]; 10 int a[maxn]; 11 int main() 12 { 13 __int64 ans; 14 int k, i, j, x, n; 15 while(cin>>n>>k) 16 { 17 if(n==0&&k==0) 18 break; 19 memset(d, 0, sizeof(d)); 20 for(i = 0; i < n; i++) 21 cin>>a[i]; 22 for(i = 0; i < n; i++) 23 d[i][1] = 1; 24 for(i = 1; i < n; i++) 25 for(j = 0; j < i; j++) 26 { 27 if(a[i]>a[j]) //条件是第i个 大于前面的 28 { 29 for(x = 2; x <= k; x++) 30 { 31 d[i][x] += d[j][x-1]; //以第i个元素 为子数列的最后一个元素,长为x的子序列,等于 以第j个元素为子序列的最后一个元素,长为x-1的子序列的和 32 } 33 } 34 } 35 ans = 0; 36 for(i = 0; i < n; i++) 37 ans += d[i][k]; 38 cout<<ans<<endl; 39 } 40 return 0; 41 }