您的位置:首页 > 产品设计 > UI/UE

hdu5568 sequence2(dp + 高精度)

2015-11-23 16:52 381 查看


sequence2

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 385 Accepted Submission(s): 151



Problem Description

Given an integer array bi with
a length of n,
please tell me how many exactly different increasing subsequences.

P.S. A subsequence bai(1≤i≤k) is
an increasing subsequence of sequence bi(1≤i≤n) if
and only if 1≤a1<a2<...<ak≤n and ba1<ba2<...<bak.

Two sequences ai and bi is
exactly different if and only if there exist at least one i and ai≠bi.



Input

Several test cases(about 5)

For each cases, first come 2 integers, n,k(1≤n≤100,1≤k≤n)

Then follows n integers ai(0≤ai≤109)



Output

For each cases, please output an integer in a line as the answer.



Sample Input

3 2
1 2 2
3 2
1 2 3




Sample Output

2
3




Source

BestCoder Round #63 (div.2)


题意:给你一个数列,求里面长度为k的上升子序列有多少。
真是sb了,不就是一个高精度吗,自己居然不敢写,实际好水。
思路:dp[i][j]表示以第i个元素结尾的长度为j的上升子序列的长度,dp[i][j] = sum(dp[1~(i-1)][j-1])。
代码写的有点丑。。。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<cstring>
using namespace std;
int a[110], dp[110][110][42];
int main()
{
    int n, k;
    while(cin>>n>>k)
    {
        for(int i = 1; i<=n; i++)
            scanf("%d", &a[i]);
        memset(dp, 0, sizeof(dp));
        for(int i = 1; i<=n; i++)
            dp[i][1][1] = 1;
        for(int i = 1; i<=n; i++)
        {
            for(int j = 2; j<=k; j++)
                for(int l = 1; l<i; l++)
                    if(a[i]>a[l])
                    {
                        int t = 0, w = 0;
                        for(int r = 1; r<=40; r++)
                        {
                            w = (dp[i][j][r] + dp[l][j-1][r] + t)/10;
                            dp[i][j][r] = (dp[i][j][r] + dp[l][j-1][r] + t)%10;
                            t = w;
                        }
                    }
        }
        int ans[42];
        memset(ans, 0, sizeof(ans));
        for(int i = 1; i<=n; i++)
        {
            int t = 0, w = 0;
            for(int r = 1; r<=40; r++)
            {
                w = (dp[i][k][r] + ans[r] + t)/10;
                ans[r] = (dp[i][k][r] + ans[r] + t)%10;
                t = w;
            }
        }
        int ok = 0;
        for(int i = 40; i>=1; i--)
        {
            if(ans[i]||ok)
            {
                printf("%d", ans[i]);
                ok = 1;
            }
        }
        if(!ok) printf("0")
            printf("\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: