终于开始DP了】
HDOJ_1159 Common Subsequence
Sample Input
abcfbc abfcab
programming contest
abcd mnp
Sample Output
4
2
0
子结构特征:
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\n",map[lena][lenb]); 24 } 25 return 0; 26 }
HDOJ1003
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:\n", i); 42 printf("%d %d %d\n", max, start + 1, end + 1); 43 if(i != t) 44 printf("\n"); 45 } 46 } 47 return 0; 48 }