T1 简单的字符串处理,注意:
①字母转数字用一个常数数组即可,不需要N个for循环
char map[26] = {'2', '2', '2', '3', '3', '3', '4', '4', '4','5', '5', '5', '6', '6', '6', '7', 0, '7', '7', '8', '8', '8', '9', '9', '9', 0}; //字手机按键上的字母与数字的映射表
②include<>一定要打完,要不然编译都错
T2 先预处理每个数,哈希,再枚举每个数,找B+C的结果是否再预处理出的hash数组里,O(N)的复杂度
int locate(int x) //预处理
{
int i=x % mod;
while((data[i]>0)&&(hash[i]!=x))++i;
return i;
}
for(i=1;i<=n;++i) //枚举B+C的结果
{
j=locate(a[i]+c);
ans+=data[j];
}
T3 DP,考试的时候以为后面的会改变前面的结果就满足无后效性,就没有去想DP的方法,结果可以由拆分区间来求解, 将[1,i]区间分成[1,j]区间与合法[j+1,i]集合组成,则要使[1,i]区间满足条件的集合数最小,显然[1,j]区间满足条件的集合数为最小,即每一段的最小值都可以从前面的某一段的最小值转移过来。
//转移方程
F[i]=MIN{F[j]}+1
{S1[j+1][i]=0 or S2[j+1][i]=0 or ABS(S1[j+1][i]-S2[j+1][i])<=M}
主要是对区间DP的思想不够熟悉,而且DP的思想理解也不够彻底。