【集训笔记】动态规划【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 }
原文地址:https://www.cnblogs.com/wushuaiyi/p/3620401.html