• 【集训笔记】动态规划【HDOJ1159【HDOJ1003


    终于开始DP了】

    HDOJ_1159  Common  Subsequence

    Sample Input
    abcfbc abfcab
    programming contest
    abcd mnp

    Sample Output
      4
      2
      0

    子结构特征:

    lf(i,j)=     f(i-1,j-1)+1 (a[i]==b[j]) 

          max(f(i-1,j),f(i,j-1)) (a[i]!=b[j])

    由于f(i,j)只和f(i-1,j-1), f(i-1,j)和f(i,j-1)有关, 而在计算f(i,j)时,

    只要选择一个合适的顺序, 就可以保证这三项都已经计算出来了,

    这样就可以计算出f(i,j). 这样一直推到f(len(a),len(b))就得到所要求的解了.

     1 #include <stdio.h>
     2 #include <string.h>
     3 int main() {
     4     int t,i,j,lena,lenb;
     5     char a[601],b[601];
     6     int map[601][601];
     7     while(EOF != scanf("%s %s",a,b)){
     8         lena=strlen(a);
     9         lenb=strlen(b);
    10         memset(map , 0 ,sizeof(map));
    11         for(i=1;i<=lena;i++){
    12             for(j=1;j<=lenb;j++){
    13                 if(a[i-1] == b[j-1])
    14                     map[i][j] = map[i-1][j-1] + 1;
    15                 else if(a[i-1] != b[j-1]){
    16                     int temp = map[i-1][j];
    17                     if(map[i][j-1] > temp)
    18                         temp = map[i][j-1];
    19                     map[i][j] = temp;
    20                 }
    21             }
    22         }
    23         printf("%d
    ",map[lena][lenb]);
    24     }
    25     return 0;
    26 }

    HDOJ1003

    Problem Description
    Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence.
    For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.
     1 #include <stdio.h>
     2 #define MAX 100005
     3 int nNum[MAX];
     4 int start, end;
     5 //算法思路:用sum和max来记录临时最大和最终最大
     6 //而start end ts te 分别用来记录起点 终点 临时起始点 终点
     7 int cal(int len){
     8     int max, i, sum, ts, te;
     9     sum = max = -9999999; //让max和sum开始置于无限小
    10     for(i = 0; i < len; i++){
    11         if(sum < 0){
    12             if(nNum[i] > sum){
    13                 sum = nNum[i];
    14                 ts = te = i;
    15                 if(max < sum){
    16                     max= sum;
    17                     start = ts;
    18                     end = te;
    19                 }
    20             }
    21         }else{
    22             sum += nNum[i];
    23             te = i;
    24             if(sum > max){
    25                 max = sum;
    26                 start = ts;
    27                 end = te;
    28             }
    29         }
    30     }
    31     return max;
    32 }
    33 int main(){
    34     int t, i, n, j;
    35     while(EOF != scanf("%d", &t)){
    36             for(i = 1; i <= t; i++){
    37             scanf("%d", &n);
    38             for(j = 0; j < n; j++)
    39                 scanf("%d", &nNum[j]);
    40             int max = cal(n);
    41             printf("Case %d:
    ", i);
    42             printf("%d %d %d
    ", max, start + 1, end + 1);
    43             if(i != t)
    44                 printf("
    ");
    45         }
    46     }
    47     return 0;
    48 }
  • 相关阅读:
    期中考试补完计划
    c++简单程序设计-4
    c++简单程序设计-3
    c++简单程序设计-2
    c++简单程序设计-1
    layer ifram 弹出框
    定时发邮件
    二维码生成
    文件或文件夹的压缩
    excel 导入 与 导出
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3620401.html
Copyright © 2020-2023  润新知