3个回答
展开全部
先按体重从小到大排序,同时记录下每个象的编号,然后从纸上中找出纸上递增的最长序列即可
有时间的话给楼主写出代码来,这不过年了么大家都忙,呵呵
花了点时间给楼主敲出代码了,累阿……
楼主体谅的加点分数吧 ^_^
有什么不懂的给我留言吧,希望对你有帮助
楼主最好告诉这题是在哪个OJ上的题目,以便我AC了,才能拿出100%的代码啊~
#include <stdio.h>
#include <stdlib.h>
int f[1002][1002];
int c[1002];//用来COPY智商以便于排序 to find LCS
int b[1002][1002];//用来记录象的编号,1代表XI==YI,2代表
int t;
struct node
{
int wg;
int tel;
int num;
}a[1002];
int cmp1(const void* a,const void* b)//对结构体二级排序,当体重想同时按智商从小到大排
{
struct node*c=(struct node*)a;
struct node*d=(struct node*)b;
if(c->wg!=d->wg)
return c->wg - d->wg;
else
return c->tel - d->tel;
}
int cmp2(const void *a ,const void *b)
{
return *(int*)b - *(int*)a;
}
void print(int i,int j)//打印出号码
{
int y;
if(i==0||j==0)
return ;
if(b[i][j]==1)
{
print(i-1,j-1);
printf("%d\n",a[i-1].num+1);
}
else if(b[i][j]==2)
print(i-1,j);
else
print(i,j-1);
}
void delc()
{
int i,j,tmp;
for(i=0;i<t;i++)
{
tmp=c[i];
for(j=i+1;j<t-1;j++)
{
if(tmp==c[j])
c[j]= -1;//相当于把相同智商的去掉,只留下一个
}
}
}
int main()
{
int i,j,k;
int n,m;
scanf("%d",&t);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
b[i][j]=0;
for(i=0;i<t;i++)
{
scanf("%d%d",&a[i].wg,&a[i].tel);
c[i]=a[i].tel;
a[i].num=i;
}
qsort(a,t,sizeof(a[0]),cmp1);
qsort(c,t,sizeof(c[0]),cmp2);
//然后开找最长公共子序列
for(i=1;i<=t;i++)
{
f[i][0]=0;
f[0][i]=0;
}
for(i=1;i<=t;i++)
{
for(j=1;j<=t;j++)
{
if(a[i-1].tel==c[j-1])
{
f[i][j]=f[i-1][j-1]+1;
b[i][j]=1;
}
else if(f[i-1][j]>=f[i][j-1])
{
f[i][j]=f[i-1][j];
b[i][j]=2;
}
else if(f[i][j]<f[i][j-1])
{
f[i][j]=f[i][j-1];
b[i][j]=3;
}
}
}
delc();
printf("%d\n",f[t][t]);//个数
print(t,t);//对应的编号
return 0;
}
打字不易,如满意,望采纳。
有时间的话给楼主写出代码来,这不过年了么大家都忙,呵呵
花了点时间给楼主敲出代码了,累阿……
楼主体谅的加点分数吧 ^_^
有什么不懂的给我留言吧,希望对你有帮助
楼主最好告诉这题是在哪个OJ上的题目,以便我AC了,才能拿出100%的代码啊~
#include <stdio.h>
#include <stdlib.h>
int f[1002][1002];
int c[1002];//用来COPY智商以便于排序 to find LCS
int b[1002][1002];//用来记录象的编号,1代表XI==YI,2代表
int t;
struct node
{
int wg;
int tel;
int num;
}a[1002];
int cmp1(const void* a,const void* b)//对结构体二级排序,当体重想同时按智商从小到大排
{
struct node*c=(struct node*)a;
struct node*d=(struct node*)b;
if(c->wg!=d->wg)
return c->wg - d->wg;
else
return c->tel - d->tel;
}
int cmp2(const void *a ,const void *b)
{
return *(int*)b - *(int*)a;
}
void print(int i,int j)//打印出号码
{
int y;
if(i==0||j==0)
return ;
if(b[i][j]==1)
{
print(i-1,j-1);
printf("%d\n",a[i-1].num+1);
}
else if(b[i][j]==2)
print(i-1,j);
else
print(i,j-1);
}
void delc()
{
int i,j,tmp;
for(i=0;i<t;i++)
{
tmp=c[i];
for(j=i+1;j<t-1;j++)
{
if(tmp==c[j])
c[j]= -1;//相当于把相同智商的去掉,只留下一个
}
}
}
int main()
{
int i,j,k;
int n,m;
scanf("%d",&t);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
b[i][j]=0;
for(i=0;i<t;i++)
{
scanf("%d%d",&a[i].wg,&a[i].tel);
c[i]=a[i].tel;
a[i].num=i;
}
qsort(a,t,sizeof(a[0]),cmp1);
qsort(c,t,sizeof(c[0]),cmp2);
//然后开找最长公共子序列
for(i=1;i<=t;i++)
{
f[i][0]=0;
f[0][i]=0;
}
for(i=1;i<=t;i++)
{
for(j=1;j<=t;j++)
{
if(a[i-1].tel==c[j-1])
{
f[i][j]=f[i-1][j-1]+1;
b[i][j]=1;
}
else if(f[i-1][j]>=f[i][j-1])
{
f[i][j]=f[i-1][j];
b[i][j]=2;
}
else if(f[i][j]<f[i][j-1])
{
f[i][j]=f[i][j-1];
b[i][j]=3;
}
}
}
delc();
printf("%d\n",f[t][t]);//个数
print(t,t);//对应的编号
return 0;
}
打字不易,如满意,望采纳。
展开全部
#include<stdio.h>
int factorial(int n)
{
if(1==n)
return 1;
else
return n*factorial(n-1);
}
void main()
{
double sum=0;
int i,n;
printf("情输入n值:");
scanf("%d",&n);
for(i=1;i<=n;i++)
sum+=1.0/factorial(i);
printf("the result is %lf\n",sum);
}
int factorial(int n)
{
if(1==n)
return 1;
else
return n*factorial(n-1);
}
void main()
{
double sum=0;
int i,n;
printf("情输入n值:");
scanf("%d",&n);
for(i=1;i<=n;i++)
sum+=1.0/factorial(i);
printf("the result is %lf\n",sum);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
main()
{
int i,sum=0,n,s=1;
printf("请输入n=");
scanf("%d",&n);
for(i=1;i<n+1;i++)
{s*=i;
printf("%d!=%d\n",i,s);
sum+=s;}
printf("sum=%d\n",sum);
}
main()
{
int i,sum=0,n,s=1;
printf("请输入n=");
scanf("%d",&n);
for(i=1;i<n+1;i++)
{s*=i;
printf("%d!=%d\n",i,s);
sum+=s;}
printf("sum=%d\n",sum);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询