标签:time first contain fir diff 预处理 case 容斥 数据
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/Others)
Total Submission(s): 4513 Accepted Submission(s): 1935
1、因为long long 类型 运算没有int快 所以要改为int型 还有取模的数mod也必须要是int型 如果mod是long long的话也会超时.2、能用int的就不要用long long,因为如果用了long long 就有可能超时;原来一直以为用ll不会爆范围,就总是用ll,现在发现了,一直用ll会爆时间,尤其是在这种矩阵快速幂的题里,绝对要注意!!!
#include<iostream> #include<string.h> #include<string> #include<math.h> #define ll long long #define mod 10007 using namespace std; int n,t; int dp[2005][2005]; char s[1005]; ll min(ll a,ll b) { return a<b?a:b; } int main() { cin>>n; t=0; while(n--) { t++; scanf("%s",s+1); int len=strlen(s+1); memset(dp,0,sizeof(dp)); for(int i=1;i<=len;i++)//初始化 dp[i][i]=1; for(int i=1;i<len;i++)//预处理 { if(s[i]==s[i+1]) dp[i][i+1]=3;//a,a,aa else dp[i][i+1]=2;//a,b } for(int l=3;l<=len;l++) { for(int i=1;i+l-1<=len;i++) { int j=i+l-1; if(j>len) break; if(s[i]==s[j])//如果首尾相等,则这段区间内的所有回文子序列都可以和首尾元素再构成新的回文子序列 dp[i][j]=(dp[i+1][j]+dp[i][j-1]+1)%mod; else dp[i][j]=(dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+mod)%mod; } } printf("Case %d: %d\n",t,dp[1][len]%mod); } return 0; }
hdu4632 Palindrome subsequence 回文子序列个数 区间dp
标签:time first contain fir diff 预处理 case 容斥 数据
原文地址:https://www.cnblogs.com/-citywall123/p/10914922.html