hdu 1080 Human Gene Functions

2023-11-17

Problem

acm.hdu.edu.cn/showproblem.php?pid=1080

Meaning

给出一个二维表 similarity[][],表示对应核苷酸配对时的相似度值,横杠 '-' 表示用空格代替一个核苷酸。

给出两个DNA序列 a[] 和 b[],可以任意添加空格,但不能空格对空格。求两串的最大相似度。

Analysis

dp[i][j]:第一串前 i 个和第二串前 j 个配出的最大相似度

在考虑 dp[i][j] 时,a[i] 可能和 b[1] ~ b[j] 的任意一个配,或者一个都不配;b[j] 也可以和 a[1] ~ a[i] 的任何一个配,或一个都不配。

当 a[i] 和 b[k] 配对时,b[k+1] ~ b[j] 的就只能和空格配。

状态转移:dp[i][j] = max { dp[i][0] + dp[0][j] , dp[i-1][s-1] + sim[ a[i] ][ b[s] ] + sum , dp[t-1][j-1] + sim[ a[t] ][ b[j] ] + sum }

其中 sum 表示 b[s+1] ~ b[j] 都和空格配,或 a[t+1] ~ a[i] 都和空格配的总相似度。

注意 a[i] 要和 b[1] ~ b[j] 都匹配一次,b[j] 也要和 a[1] ~ a[i] 都匹配一次。

dp[i][0] 表示第一串前 i 个都和空格配的总相似度;dp[0][j] 类似。

为了好用那个表,可以对DNA串进行格式化,把 A 变成 0,C 变成 1…,空格是 4。

Source code

#include <stdio.h>
#define N 100
#define BIG 12345
#define NUC 4 /* nucleotides */

const int c[5][5] = {
	{5, -1, -2, -1, -3},
	{-1, 5, -3, -2, -4},
	{-2, -3, 5, -2, -2},
	{-1, -2, -2, 5, -1},
	{-3, -4, -2, -1, -BIG}
};
char a[N+3], b[N+3];
int aa[N+1], bb[N+1], dp[N+1][N+1];

void format(char *s, int *d, int l)
{
	for( ; l; --l)
		if(s[l] == 'A')
			d[l] = 0;
		else if(s[l] == 'C')
			d[l] = 1;
		else if(s[l] == 'G')
			d[l] = 2;
		else if(s[l] == 'T')
			d[l] = 3;
}

int max(int x, int y)
{
	return x > y ? x : y;
}

int main()
{
	int t;
	scanf("%d", &t);
	while(t--)
	{
		int la, lb, i, j;
		scanf("%d %s %d %s", &la, a+1, &lb, b+1);
		format(a, aa, la);
		format(b, bb, lb);

		dp[0][0] = 0;
		for(i=1; i<=la; ++i)
			dp[i][0] = dp[i-1][0] + c[aa[i]][NUC];
		for(j=1; j<=lb; ++j)
			dp[0][j] = dp[0][j-1] + c[NUC][bb[j]];

		for(i=1; i<=la; ++i)
			for(j=1; j<=lb; ++j)
			{
				int cnt = 0, k;
				// a[]前i个全和空格配,b[]前j个也全和空格配
				dp[i][j] = dp[i][0] + dp[0][j];
				// a[i]和b[1] ~ b[j]配
				for(k=j; k; --k)
				{
					dp[i][j] = max(dp[i][j],
						dp[i-1][k-1] + c[aa[i]][bb[k]] + cnt);
					cnt += c[NUC][bb[k]];
				}
				// b[j]和a[1] ~ a[i]配
				cnt = 0;
				for(k=i; k; --k)
				{
					dp[i][j] = max(dp[i][j],
						dp[k-1][j-1] + c[aa[k]][bb[j]] + cnt);
					cnt += c[aa[k]][NUC];
				}
			}
		printf("%d\n", dp[la][lb]);
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hdu 1080 Human Gene Functions 的相关文章

  • 使用 #pragma Once 和 #ifndef 时出现 VS 2010 C++ LNK2005 错误

    1 gt Deck obj error LNK2005 class Card card card 3VCard A already defined in Card obj 1 gt PokerTester obj error LNK2005
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

    我有以下开始的代码robocopy https technet microsoft com en us library cc733145 aspx as a Process 我还需要进行数据库查询以确定每次需要复制哪些目录robocopy被
  • 展开 std::reference_wrapper 的成本

    Given include
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐