请教一道算法设计题

来源:百度知道 编辑:UC知道 时间:2024/07/03 04:21:51
疯狂数组
在N个数中,找出疯狂数字,疯狂数组是由5个数组成的(i,j,k,m,n)
满足
1. 1 ≤ i < j < k < l < m ≤ N
2. Ai < Aj < Ak < Al < Am
例如:在序列( 2 , 1 , 3 , 4 , 5 , 7 , 6 ) ,有4个疯狂的数组: ( 1 , 3 , 4 , 5 , 6 ) , ( 2 , 3 , 4 , 5 , 6 ) , ( 1 , 3 , 4 , 5 , 7 )和( 2 , 3 , 4 , 5 , 7 ) 。
问题就是要在这堆数中找出疯狂数组的个数
输入N,下一行输入N个数
输出就是疯狂数组的个数

输入
5
1 2 3 4 5
7
2 1 3 4 5 7 6
7
1 2 3 4 5 6 7
输出
1
4
21
这道题是ACM题目,有点难,请教高手指点思路与算法.
采纳后可加分,100分以上

好怀念当初参加高中计算机奥赛的日子啊……。可惜无缘 ACM,一辈子的遗憾。
现在老了,做这个题居然花了一个多小时。

回正题:
该题用动态规划方法求解。楼主既然参加 ACM,知道了方法和以下代码,应该就没有什么大问题了吧。如果有问题,加 Q 聊(见个人资料)。

因为原题并不是很详细,这里假设输入的数据都满足条件,没有加输入数据的判断(这个很容易)

另外,输入数据仅仅做了一次处理一组。估计要求是从文件读入数据,但是没有更详细的要求,就只做了 scanf 的输入。

代码如下:

// VC6.0 编译通过
#include <stdio.h>

int main()
{
int i, j; // 循环变量
int *A, A_Count;
int **D; // 动态规划的过程数组
int pi, pj;
int sum;

// 输入数据
printf("请输入序列个数: ");
scanf("%d", &A_Count);
A = new int[A_Count];
printf("请输入序列(空格分隔): ");
for (i=0; i<A_Count; i++)
scanf("%d", &A[i]);

// 初始化动态规划的过程数组
D = new int* [A_Count];
for (i=0; i<A_Count; i++)
D[A_Count-1-i] = new int[(1<<i)+1];

// 动态规划求解
D[A_Count-1][0] = 1;
D[A_Count-1][1] = 0;

for (i=A_Count-1; i>=0; i--)
{