题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=76

题目大意:在一个DNA上,给定许多基因的起始位置和结束位置,求出这条链上最多同时存在多少基因?并依次输出选择基因的序列号。

Sample Input

6
340 500
220 470
100 300
880 943
525 556
612 776
3
705 773
124 337
453 665
0

Sample Output

3 1 5 6 4
2 3 1

分析:有两种思路。1.最长上升子序列+路径打印;2.贪心

法1:

 //dp[i] = max{0,dp[j]}+1,j<i
//时间复杂度仍为 O(n^2)
// # include<stdio.h>
# include<string.h>
# include<stdlib.h>
# define MAX struct node{
int x,y,id; //x,y分别是基因起始和结束位置,id表示基因的序列号
}data[MAX]; int n;
int pre[MAX]; //记录前驱
int dp[MAX]; //LIS中保存最大数目
int output[MAX]; //记录输出 int cmp(const void *a,const void *b){ //将序列从小到大排序
struct node *c = (node *)a;
struct node *d = (node *)b;
if(c->x == d->x)
return c->y - d->y;
return c->x - d->x;
} void solve(){
int i,j,m;
qsort(data,n,sizeof(data[]),cmp);
pre[] = -;
dp[] =;
for(i=;i<n;i++){
pre[i] = -;
dp[i] = ;
m = ;
for(j=;j<i;j++){
if(data[j].y < data[i].x){
if(m<dp[j]){
m = dp[j]; //LIS
pre[i] = j;
}
}
}
dp[i] += m ;
}
j = m = ;
for(i=;i<n;i++){ //找到最长的序列的最后一个
if(dp[i] > m){
j = i;
m = dp[i];
}
}
i = ;
while(j != -){
output[i++] = j;
j = pre[j];
}
for(j=i-; j>; j--)
printf("%d ",data[output[j]].id);
printf("%d\n",data[output[j]].id);
}
int main(){
while(scanf("%d",&n) && n){
for(int i=;i<n;i++){
scanf("%d%d",&data[i].x,&data[i].y);
data[i].id = i+;
}
solve();
}
return ;
}

法2:

 /*可以将基因起始点看成一个作业的开始时间,基因终点看成完成该作业的终止时间。用这些基因拼出长度最长的基因序列(连续的基因前一个终点不能大于等于后一个基因起始点),相当于求能完成的最多作业序列。这是贪心的典型例题。可用贪心算法解决,贪心策略——优先考虑先完成的作业。*/
#include <stdio.h>
#include <string.h> int input[][]; //input[i][0]:起始位置,input[i][1]:终止位置,input[i][2]:编号 int main( )
{
int N, i, j, k;
int temp, max;
/*输入基因个数N,N=0时测试结束*/
while( scanf( "%d", &N ) )
{
if( N== ) break; //输入结束
memset( input, , sizeof(input) );
/*输入基因起始点,终止点,并给基因编号*/
for( i=; i<N; i++ )
{
scanf( "%d%d", &input[i][], &input[i][] );
input[i][] = i + ;
}
/*对基因按终止点小的排序,<1000的用例,选择排序法*/
for( i=; i<N; i++ )
{
temp = input[i][];
k = i;
for( j = i + ; j<N; j++ )
{
if( temp>input[j][] )
{
k = j;
temp = input[j][];
}
}
temp = input[i][];
input[i][] = input[k][];
input[k][] = temp;
temp = input[i][];
input[i][] = input[k][];
input[k][] = temp;
temp = input[i][];
input[i][] = input[k][];
input[k][] = temp;
}
/*贪心选择输出被选择的基因编号*/
max = input[][];
printf( "%d", input[][] );
for( i=; i<N; i++ )
{
if( input[i][]>max )
{
printf( " %d", input[i][] );
max = input[i][];
}
}
printf("\n");
}
return ;
}

ZOJ 1076 Gene Assembly(LIS+路径打印 贪心)的更多相关文章

  1. ZOJ 1076 Gene Assembly LIS

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=76 题目大意: 题目前面都是废话. 给你一串基因,然后给你上面的外显子的起始和终 ...

  2. ZOJ 1076 Gene Assembly

    原题链接 题目大意:首先学习一个生物学的单词,exon:外显子,DNA序列中能够翻译表达的片段.给出很多外显子的起始点和终点,求寻找包含最多外显子的一条链,并且输出这些外显子的编号. 解法:先把所有外 ...

  3. L2-001 紧急救援 (25 分) (最短路+路径打印)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 题目: 作为一个城市的应急救援队伍的负 ...

  4. Minimum Transport Cost HDU1385(路径打印)

    最短路的路径打印问题 同时路径要是最小字典序 字典序用floyd方便很多 学会了两种打印路径的方法!!! #include <stdio.h> #include <string.h& ...

  5. POJ 3984 迷宫问题(简单bfs+路径打印)

    传送门: http://poj.org/problem?id=3984 迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  6. 代码实现:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名

    package com.loaderman.test; import java.io.File; import java.io.FileReader; import java.util.Scanner ...

  7. 贪心,Gene Assembly,ZOJ(1076)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=76 解题报告: 1.类似活动安排问题. 2.输出格式要注意. #inc ...

  8. HDU-1160.FatMouse'sSpeed.(LIS变形 + 路径打印)

    本题大意:给定一定数量的数对,每个数保存着一只老鼠的质量和速度,让你求出一个最长序列,这个序列按照质量严格递增,速度严格递减排列,让你输出这个序列的最长长度,并且输出组成这个最长长度的序列的对应的老鼠 ...

  9. ZOJ 2432 Greatest Common Increasing Subsequence(最长公共上升子序列+路径打印)

    Greatest Common Increasing Subsequence 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problem ...

随机推荐

  1. ASPNETMVC多语言方案

    ASPNETMVC多语言方案 前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生 ...

  2. Unity3d BTDF实时折射模拟有粗糙度的半透明物体

    折射的原理是运用BTDF的一个球形高斯近似 需要考虑折射光的来源,一般会想到用环境贴图(IBL)或者grab texture,但是折射光不全都来自一个平面,所以选择环境贴图来作为折射光.这个效果主要是 ...

  3. yii项目开发项目常用技巧和方法汇总

    1.使用CActiveForm类组件如何输出不带html属性的结果 eg:<?php echo $form->textField($model,'email',array('size'=& ...

  4. 手机APP上下滚动翻页效果

    //页面初期加载时        $(document).ready(function () { //加载第一页            LoadList(); //滚动换页            $( ...

  5. 【转】android多分辨率适配

    前一阶段开发android项目,由于客户要求进行多分辨率适配,能够支持国内主流的分辨率手机.因此经过了几次开发走了很多弯路,目前刚刚领略了android多分辨率适配的一些方法. 先介绍一下所走的弯路, ...

  6. SPOJ 1043 1043. Can you answer these queries I

    思路:用TREE记录节点的最大连续和,LEF记录左边开始的最大连续和,RIG记右边开始的最大连续和 然后处理的时候就是比较左边最大,右边最大  中间区间的问题 其中这个query 只能膜拜了... 大 ...

  7. android 65 文件访问权限

    package com.itheima.createfile; import java.io.File; import java.io.FileNotFoundException; import ja ...

  8. lambda与函数调用的转换

    14.38 编写一个类令其检查某个给定的string对象的长度是否与一个阈值相等.使用该对象编写程序,统计并报告在输入的文件中长度为1的单词有多少个,长度为2的单词有多少个.......长度为10的单 ...

  9. 【NodeJs】用arrayObject.join('')处理粘包的错误原因

    服务器测试代码如下: var net = require('net'); var server = net.createServer(function(c){ console.log('client ...

  10. .net单元测试——解除依赖

    最近在看.net单元测试艺术,我也喜欢单元测试,这里写一下如何在测试中解除对象间的依赖. 假如有这样的一个需求,当用户登陆时,我需要对用户名和密码进行验证,然后再将用户名写入日志中. public c ...