ZOJ 1076 Gene Assembly(LIS+路径打印 贪心)
题目链接: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+路径打印 贪心)的更多相关文章
- ZOJ 1076 Gene Assembly LIS
		
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=76 题目大意: 题目前面都是废话. 给你一串基因,然后给你上面的外显子的起始和终 ...
 - ZOJ 1076 Gene Assembly
		
原题链接 题目大意:首先学习一个生物学的单词,exon:外显子,DNA序列中能够翻译表达的片段.给出很多外显子的起始点和终点,求寻找包含最多外显子的一条链,并且输出这些外显子的编号. 解法:先把所有外 ...
 - L2-001 紧急救援 (25 分) (最短路+路径打印)
		
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 题目: 作为一个城市的应急救援队伍的负 ...
 - Minimum Transport Cost HDU1385(路径打印)
		
最短路的路径打印问题 同时路径要是最小字典序 字典序用floyd方便很多 学会了两种打印路径的方法!!! #include <stdio.h> #include <string.h& ...
 - POJ 3984 迷宫问题(简单bfs+路径打印)
		
传送门: http://poj.org/problem?id=3984 迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
 - 代码实现:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名
		
package com.loaderman.test; import java.io.File; import java.io.FileReader; import java.util.Scanner ...
 - 贪心,Gene Assembly,ZOJ(1076)
		
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=76 解题报告: 1.类似活动安排问题. 2.输出格式要注意. #inc ...
 - HDU-1160.FatMouse'sSpeed.(LIS变形 + 路径打印)
		
本题大意:给定一定数量的数对,每个数保存着一只老鼠的质量和速度,让你求出一个最长序列,这个序列按照质量严格递增,速度严格递减排列,让你输出这个序列的最长长度,并且输出组成这个最长长度的序列的对应的老鼠 ...
 - ZOJ 2432 Greatest Common Increasing Subsequence(最长公共上升子序列+路径打印)
		
Greatest Common Increasing Subsequence 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problem ...
 
随机推荐
- ODAC with Oracle Developer Tools for Visual Studio
			
c#开发Oracle数据库的时候,需要本机没有安装过 Oracle 客户端,直接下载 ODAC with Oracle Developer Tools for Visual Studio工具安装即可 ...
 - java基础(十七)集合(四)
			
这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...
 - date 、cal、bc
			
date cal date是显示日期与时间 date +%Y/%M/%D date +%Y/%m/%d date +%H:%M cal cal 2016
 - 【转】shell 教程——07 Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
			
前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid,看下面的代码: $echo $$ 运 ...
 - IIS发布站点错误
			
发布站点的时候出现以下错误:解决方法: 1. 设置c:windows\temp 目录访问权限 temp--> 属性-->安全-- > 添加network service --> ...
 - php 写一个水仙花数的函数
			
判断一个数是不是水仙花数 <?php function is_shuixianhua($i) { $length=strlen($i); $i=(string)$i; $sum=0; for($ ...
 - 解决SDK下载时速度过慢的问题
			
1.打开android sdk manager 2.打开tool->options,如图所示 3.将Proxy Settings 里的HTTP Proxy Server和HTTP Proxy P ...
 - Datediff函数 助你实现不同进制时间之间的运算
			
在VB开发环境中实现时间之间的加减运算有很多种方法,前不久自己无意中发现了Datediff函数,它能够比较简单.全面地实现我们比较常用的时间之间的运算,今由自己的研究,搞清了它的一些用法,拿来和大家分 ...
 - 一步一步学android控件(之二十五)—— SeekBar
			
SeekBar扩展自ProgressBar——在ProgressBar的基础上添加了一个用户可以拖拽的thum. SeekBar.OnSeekBarChangeListener是接收SeekBar进度 ...
 - 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
			
在用本地的navicat连接服务器的mysql数据库时候出现下面的问题: 解决的方法: 解决方法: 1.改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhos ...