hdu 5568 高精度(重要) DP

来源:互联网 发布:java用户登录界面设计 编辑:程序博客网 时间:2024/05/07 08:32

这个题似乎有问题,题中明明要求每个数组不同,想了很久,不知道怎么判重复,最后却看别人都是不判重 直接过的


dp[i][j] 表示第i个数作为第j个数 的情况

dp[i][f] = sum(dp[j][f-1])    num[i] > num[j]


另外,如果大数使用十进制计算  要么 wrong answe  要么 爆内存  ,所以尽量开大 ,这里用的10^8

#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>using namespace std;#define MS(x,y) memset(x,y,sizeof(x))#define MOD 100000000void fr(){freopen("t.txt","r",stdin);}typedef long long LL;struct Bignum{    int len,a[101];    Bignum()    {        len = 0;        MS(a,0);    }}dp[105][105],ans;void add(Bignum &a,Bignum &b){    int len = max(a.len,b.len);    int i,j;    for(i = 1; i <= len; i++)    {        a.a[i] += b.a[i];        a.a[i+1] += a.a[i]/MOD;        a.a[i] %= MOD;    }    if(a.a[len+1]) len++;    a.len = len;}void print(Bignum &a){    int i;    printf("%d",a.a[a.len]);    for(i = a.len-1; i>0; i--) printf("%08d",a.a[i]);}int main(){   // fr();    int i,j,f,n,k,num[105];    while(~scanf("%d%d",&n,&k))    {        ans.len = 0;        MS(ans.a,0);        MS(dp,0);        for(i = 0; i < n; i++)        {            scanf("%d",&num[i]);            dp[i][1].a[1] = dp[i][1].len = 1;        }        for(i = 1; i < n; i++)        {            for(j = 0; j <= i-1; j++)            {                if(num[i] > num[j])                {                    for(f = 2; f <= k; f++)                    {                        add(dp[i][f],dp[j][f-1]);                    }                }            }        }        for(i = 0; i < n; i++)        {            add(ans,dp[i][k]);        }        print(ans);        puts("");    }}


0 0
原创粉丝点击