程序设计实习(II)19_动态规划.pptVIP

  • 4
  • 0
  • 约1.06万字
  • 约 50页
  • 2018-01-30 发布于浙江
  • 举报
程序设计实习(II)19_动态规划

最长公共子序列 Sample Input abcfbc abfcab programming contest abcd mnp Sample Output 4 2 0 输入两个子串s1,s2, 设MaxLen(i,j)表示: s1的左边i个字符形成的子串,与s2左边的j个字符形成的子串的最长公共子序列的长度 MaxLen(i,j) 就是本题的“状态” 假定 len1 = strlen(s1),len2 = strlen(s2) 那么题目就是要求 MaxLen(len1,len2) 最长公共子序列 显然:MaxLen(n,0) = 0 ( n= 0…len1) MaxLen(0,n) = 0 ( n=0…len2) 递推公式: if ( s1[i-1] == s2[j-1] ) MaxLen(i,j) = MaxLen(i-1,j-1) + 1; else MaxLen(i,j) = Max(MaxLen(i,j-1), MaxLen(i-1,j) ); 最长公共子序列 S1 s1[i-1] S2 s2[j-1] S1i-1 S2j-1 S1长度为 i S2长度为 j MaxLen(S1,S2)不会比MaxLen(S1,S2j-1) 和 MaxLen(S1i-1,S2)都大,也不会比两者中任何一个小 #include iostream.h #include string.h char sz1[1000]; char sz2[1000]; int anMaxLen[1000][1000]; main() { while( cin sz1 sz2 ) { int nLength1 = strlen( sz1); int nLength2 = strlen( sz2); int nTmp; int i,j; for( i = 0;i = nLength1; i ++ ) anMaxLen[i][0] = 0; for( j = 0;j = nLength2; j ++ ) anMaxLen[0][j] = 0; for( i = 1;i = nLength1;i ++ ) { for( j = 1; j = nLength2; j ++ ) { if( sz1[i-1] == sz2[j-1] ) anMaxLen[i][j] = anMaxLen[i-1][j-1] + 1; else { int nLen1 = anMaxLen[i][j-1]; int nLen2 = anMaxLen[i-1][j]; if( nLen1 nLen2 ) anMaxLen[i][j] = nLen1; else anMaxLen[i][j] = nLen2; } } } cout anMaxLen[nLength1][nLength2] endl; } } 活学活用 掌握递归和动态规划的思想,解决问题时灵活应用 例题: POJ 1661 Help Jimmy Help Jimmy 是在下图所示的场景上完成的游戏: 场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。 Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。 设计一个程序,计算Jimmy到地面时可能的最早时间。 输入数据 第一行是测试数据的组数t(0 = t = 20)。每组测试数据的第一行是四个整数N,X,Y,MAX,用空格分隔。N是平台的数目(不包括地面),X和Y是Jimmy开始下落的位置的横竖坐标,MAX是一次下落的最大高度。接下来的N行每行描述一个平台,包括三个整数,X1[i],X2[i]和H[i]。H[i]表示平台的高度,X1[i]和X2[i]表示平台左右端点的横坐标。1 = N = 1000,-20000 = X, X1[i], X2[i] = 20000,0 H[i] Y = 20000(i = 1..N)。所有坐标的单位都是米。 Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保Jimmy一定能安全到达地面。 输出要求 对输入的每组测试数据,输

文档评论(0)

1亿VIP精品文档

相关文档