求最长合法序列

jaycsu 2005-12-04 09:15:15
最长合法序列

Time Limit:1000MS Memory Limit:65536K
Total Submit:55 Accepted:4

Description

有k个整数A[1],A[2]…A[k](0 < a[i] <= 2000000000, 0 < i <= k, 0 < k <= 1000,),你需要从前往后选出若干数,使得每一个后面的数都要大于或等于前面的数。例如,对于序列1,4,2,5,2,3,选出1,2,2,3是合法的,但是选出4,2,3是不合法的。
请你编写程序对于一个已知序列,求出最长的合法序列的数的个数。


Input

第一行为n,表示n个测试序列;
第二行到第n+1行,每行开始第一个数为k, k后面紧跟k个数A[1],A[2]….A[k]


Output

输出n行,每行输出一个整数,表示相应测试序列中最长的合法序列的数的个数。

Sample Input


2
12 13 45 23 53 23 88 123 3 125 10 87 89
6 1 4 2 5 2 3


Sample Output


6
4




请高手看一下我写的程序怎么回事不能出来正常结果
#include<stdio.h>

int main(){


int i, j,m=0,a[100],b[100];
scanf("%d",&a[0]);
for(i=1;i<=a[0];i++)
scanf("%d",&a[i]);


b[1]=a[1];
b[0]=1;
for(i=2;i<=a[0];i++){


if(a[i]>=b[1]){

for (j=1;j<=b[0];j++)
{if(a[i]<b[j])
{b[j]=a[i];b[0]=j; m=1;}
}
if(!m)
{ b[b[0]+1]=a[i];
b[0]+=1;}
}
}


printf("%d\n",b[0]);
}
...全文
530 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
fjm_520 2005-12-05
  • 打赏
  • 举报
回复
555555555

学习
yulin001122 2005-12-05
  • 打赏
  • 举报
回复
if(f[p]>=f[i]) then count[p] = count[i] +1; (i=[1..p-1]);
yulin001122 2005-12-05
  • 打赏
  • 举报
回复
传说中的导弹问题。。。
用DP吧。。。
jordan1 2005-12-05
  • 打赏
  • 举报
回复
真晕啊,以后再看先上课。
Mr_Yang 2005-12-04
  • 打赏
  • 举报
回复
学习。
ahatony 2005-12-04
  • 打赏
  • 举报
回复
其实这题当时做的时候是用DP 动态规划的 ,不过现在忘了 ^_*
楼主去搜一下,应该有标程的
ahatony 2005-12-04
  • 打赏
  • 举报
回复
又是ACM的题目 %^$%&*$%^#$%!@ 当年没练好 今天重新学习 呵呵~
cunsh 2005-12-04
  • 打赏
  • 举报
回复
输入第 1 个数字:12
输入第 2 个数字:13
输入第 3 个数字:45
输入第 4 个数字:23
输入第 5 个数字:53
输入第 6 个数字:23
输入第 7 个数字:88
输入第 8 个数字:123
输入第 9 个数字:3
输入第 10 个数字:125
输入第 11 个数字:10
输入第 12 个数字:87
输入第 13 个数字:89
最长的是:7
Press any key to con

是啊.这个就是7.
用另一个测试也对.

楼主.作对了要给我分呀.
cunsh 2005-12-04
  • 打赏
  • 举报
回复
#include<iostream.h>
#define N 13
//12 13 45 23 53 23 88 123 3 125 10 87 89
int shuju[N]; //输入的数字序列
int tu[N][N]; //图


void shuru(){ //输入数据
for(int i=0; i<N; i++){
cout << "输入第 " << i + 1 <<" 个数字:" ;
cin >> shuju[i];
}
}

void gouzaotu(){ //构造有向图tu
for (int i=0; i<N; i++)
for (int j=i+1; j<N; j++)
{
if (shuju[i] <= shuju[j])
tu[i][j] = 1;
}
}

int biaoji[N] = {0}; //保存以所有顶点开始的最大序列的长度.
int zuidazixuliechangdu(int x) //求以给定的第x个顶点开始的最大序列长度
{
if (biaoji[x] != 0) return biaoji[x];
int re = 0;
for (int i=x+1; i<N; i++)
{
if (tu[x][i] == 1)
{
int temp = zuidazixuliechangdu(i);
if(temp > re)
re = temp;
}
}
re += 1;
biaoji[x] = re ;
return re ;
}
int main(){
shuru();
gouzaotu();

int zuichang=0 ; //
for(int i=0; i<N; i++)
{
biaoji[i] = zuidazixuliechangdu(i);
if (biaoji[i] > zuichang)
zuichang = biaoji[i];
}

cout << "最长的是:" << zuichang << endl;

return 0;
}
xiaocai0001 2005-12-04
  • 打赏
  • 举报
回复
哪个网站的ACM题哟?
antijpn 2005-12-04
  • 打赏
  • 举报
回复
12 13 45 23 53 23 88 123 3 125 10 87 89

12 13 45 53 88 123 125明明就是7而不是6
12 13 23 23 88 123 125明明也是7而不是6

题目都出的有问题……
province_ 2005-12-04
  • 打赏
  • 举报
回复
问题就是求最长递增子序列,已经有答案了,楼主可以搜索一下的。
cunsh 2005-12-04
  • 打赏
  • 举报
回复
3 10 87 89
这也是一个合法的序列.但它的长度不是最长的呀.
题目是求最长长度的.
jixingzhong 2005-12-04
  • 打赏
  • 举报
回复
使得每一个后面的数都要大于或等于前面的数
每一个后面的数 是不是后面所有的数?
那么 3 在的前面的数据就不用考虑了 ...
怎么回出来那么多的数据 ?
cunsh 2005-12-04
  • 打赏
  • 举报
回复
我是想
构造一个有向图.后边的数字和前边小于它的数字有边连接.
如果哪个顶点的数字比它前边所有的顶点的数字都小.图就成了非连通的了.(第二个例子就是)

构造好了以后.再找这个图的最大连通分量.

这个办法行吗?
xiaocai0001 2005-12-04
  • 打赏
  • 举报
回复
可以好好考虑考虑

从后面往前面找呢?
cunsh 2005-12-04
  • 打赏
  • 举报
回复
楼主你的程序肯定不对的呀.
你的程序里. m=1 只对m修改了1次呀.

而且你的算法好像也不对.
你在循环里的 if(a[i]>=b[1]){
这句话使得测试第二个例子时6 1 4 2 5 2 3
b[1] 为6 . 后边的1 4 2 5 2 3 在这个if中都为假.
cunsh 2005-12-04
  • 打赏
  • 举报
回复
12 13 23 23 88 123
楼上.他的意思是最长的一个合法序列的数字个数呀.
jixingzhong 2005-12-04
  • 打赏
  • 举报
回复
使得每一个后面的数都要大于或等于前面的数
12 13 45 23 53 23 88 123 3 125 10 87 89
这个序列怎么输出了 6 ?


上面的 使得每一个后面的数都要大于或等于前面的数 是什么意思?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧