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 }

 

posted @ 2014-03-29 10:30  水门  阅读(174)  评论(0编辑  收藏  举报