hdu5568 sequence2 dp+大数
Posted 文竹balala
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu5568 sequence2 dp+大数相关的知识,希望对你有一定的参考价值。
题意:给n和m,和 n个数求n个数中有多少个不同的长度为m的数列且严格递增
分析: 题意很容易理解,也很容易想到dp,dp[i][k] += sum(dp[j][k-1]),其中j<i&&a[i]>a[j];
但是对本题来讲很容易WA,搜了题解才知道要用大数
然后就是开始了我写大数的悲催之路,也可能是受网上的代码的影响,自己写出来的大数四不像,改了好久才发现错误
个人感觉写简单的大数
具体思路看代码.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cctype>
#include <stack>
#include <algorithm>
using namespace std;
const int maxn = 105;
const int mode = 100000000;
struct node
int sum[105];
int len;
node()//构造函数
len = 1;//初始长度都为1,内容为0
memset(sum, 0, sizeof(sum));
void add(node a)
int re = 0;
int max_len = max(len, a.len);
for (int i = 0; i < max_len; i++)
int tmp = re + sum[i] + a.sum[i];//模拟手动加法的过程,不断向前进位
sum[i] = tmp%mode;
//cout
re = tmp/mode;
len = max_len;
while (re != 0)
sum[len] = re%mode;
len++;
re /= mode;
;
node dp[maxn][maxn];
int a[maxn];
int main()
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int n, m;
while (cin >> n >> m)
memset(dp, 0, sizeof(dp));
node ans;
for (int i = 0; i < n; i++)//dp[i]1]都置为1
scanf("%d", a+i);
dp[i][1].len = 1;
dp[i][1].sum[0] = 1;
for (int i = 0; i < n; i++)
for (int j = 0; j < i; j++)
if (a[i] > a[j])
for (int k = 2; k <= m; k++)
dp[i][k].add(dp[j][k-1]);
for (int i = 0; i < n; i++)
ans.add(dp[i][m]);
printf("%d", ans.sum[ans.len-1]);
for (int i = ans.len-2; i >= 0; i--)
printf("%08d", ans.sum[i]);
cout << endl;
return 0;
以上是关于hdu5568 sequence2 dp+大数的主要内容,如果未能解决你的问题,请参考以下文章