ACMICPC
Time Limit:1000MS Memory Limit:32768K
Description:
大写字母A-Z分别对应整数[-13,12],因此,一个字符串对应了一个整数列。我们把字符串对应的整数列的和称为该字符串的特性值。例如:字符串ACM对应的整数列为{-13,-11,-1},则ACM的特性值为(-13)+(-11)+(-1)=-25;其子串AC的特性值为-24;子串M的特性值为-1。给你一个字符串,请找出该字符串的所有子串的最大特性值。Input:
第一行的正整数 N(1<=N<=1000)表示其后有N组测试数据,每组测试数据都由一个字符串组成。字符串只能由大写字母A-Z组成,且字符串的长度不会超过1000。Output:
输出有N行,每行是一组测试数据的输出结果。Sample Input:
2 ACM ANGRY
Sample Output:
-1 15
http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1021
/* --------------------------------------------------------------------------------
非动态规划解法:
做法:遍历所有字串,找出最大那个。
时间:297MS
内存:196K
-------------------------------------------------------------------------------- */
#include<stdio.h>
char szStr[1004] ;
int a[1004] ;
int main(void)
{
int i = 0 ;
int j = 0 ;
int t = 0 ;
int n = 0 ;
int nMax = -1000 ;
scanf("%d",&t) ;
getchar() ;
while(t-- > 0)
{
gets(szStr) ;
nMax = -1000 ;
j = 1 ;
i = 0 ;
while(szStr[i] != '\0')
{
a[j++] = szStr[i] - 65 - 13 ;
i++ ;
}
n = j - 1 ;
a[0] = 0 ;
for(i = 1 ; i <= n ; ++i)
{
if(a[i] >= nMax)
{
nMax = a[i] ;
}
a[i] += a[i-1] ;
if(a[i] >= nMax)
{
nMax = a[i] ;
}
for(j = 1 ; j < i ; ++j )
{
if(a[i] - a[j] >= nMax)
{
nMax = a[i] - a[j] ;
}
}
}
printf("%d\n",nMax) ;
}
return 0 ;
}
/* ---------------------------------------
动态规划解法:
时间:9MS
内存:200K
--------------------------------------- */
#include<stdio.h>
#define max(x,y) ((x)>(y) ? (x) : (y))
char szStr[1004] ;
int a[1004] ;
int b[1004] ;
int main(void)
{
int i = 0 ;
int j = 0 ;
int t = 0 ;
int n = 0 ;
int nMax = -1000 ;
scanf("%d",&t) ;
getchar() ;
while(t-- > 0)
{
gets(szStr) ;
nMax = -1000 ;
j = 1 ;
i = 0 ;
while(szStr[i] != '\0')
{
a[j++] = szStr[i] - 65 - 13 ;
i++ ;
}
n = j - 1 ;
b[0] = -1000 ;
nMax = -1000 ;
for(i = 1 ; i <= n ; ++i)
{
b[i] = max(a[i],b[i-1]+a[i]) ;
if(nMax < b[i])
{
nMax = b[i] ;
}
}
printf("%d\n",nMax) ;
}
return 0 ;
}
/* --------------------------------------------------------------------------------------
动态规划解法:
不过,优化了时间和空间复杂度。在时间方面边输入边处理,所以只是遍历一次。
在空间方面因为是边输入边处理,所以不用字符串来保存。
时间:7MS
内存:196K
-------------------------------------------------------------------------------------- */
#include<stdio.h>
#define max(x,y) ((x)>(y) ? (x) : (y))
int b[1004] ;
int main(void)
{
int i = 0 ;
int j = 0 ;
int t = 0 ;
int n = 0 ;
int nMax = -1000 ;
int nTemp = 0 ;
char chCur = '\0' ;
scanf("%d",&t) ;
getchar() ;
while(t-- > 0)
{
nMax = -1000 ;
b[0] = -1000 ;
i = 1 ;
while((chCur = getchar()) != '\n')
{
nTemp = chCur - 65 - 13 ;
b[i] = max(nTemp,b[i-1]+nTemp) ;
if(nMax < b[i])
{
nMax = b[i] ;
}
i++ ;
}
printf("%d\n",nMax) ;
}
return 0 ;
}