hdu 1243
来源:互联网 发布:手机4g网络提速方法 编辑:程序博客网 时间:2024/05/29 19:36
主题思想: 这是一个变形LCS,但是我却TLE了,
代码和求LCS基本一样,只不过LCS是长度加1, 这里是加恐怖分子权重。
TLE的根本原因是: 使用了memset,, memset对所有结果进行赋值,但是其实我们只需要初始化
dp[0][j] (j 取 1,–列的长度) 和 dp[i][0] (i 取 1,,行数) dp[0][0] m+n+1 个
而memset,是对m*n个进行赋值,所以浪费了时间。造成TLE。
总结: dp 的时候,不要使用memset进行不必要的赋值初始化,而是只初始化一部分。
状态转移方程:
if(s[i-1]==t[j-1]){ dp[i][j]=dp[i-1][j-1]+score[s[i-1]]; }else{ dp[i][j]=max(dp[i-1][j],dp[i][j-1]); }
AC代码:
#include <iostream>#include<cstdio>#include<cstring>#include<string>#include<map>#include<vector>#include<algorithm>using namespace std;map<char,int> score;const int maxn=3000;int dp[maxn][maxn];int LCS(char s[],char t[]){ int n=strlen(s); int m=strlen(t); for(int i=1;i<=m;i++) dp[0][i]=0; for(int i=1;i<=n;i++) dp[i][0]=0; dp[0][0]=0; int ans=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(s[i-1]==t[j-1]){ dp[i][j]=dp[i-1][j-1]+score[s[i-1]]; }else{ dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } } return dp[n][m];}int main(){ int n; string s; int tmp; char b[maxn];//bullet char t[maxn]; //terroists; while(scanf("%d",&n)!=EOF){ cin>>s; for(int i=0;i<n;i++){ scanf("%d",&tmp) ; score[s[i]]=tmp; } scanf("%s%s",b,t); int ans=0; ans=LCS(b,t); printf("%d\n",ans); } return 0;}
阅读全文
0 0
- HDU-1243
- hdu 1243
- HDU 1243 URLs
- HDU 1243 DP
- HDU 1243 【基础DP 】
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu5025Saving Tang Monk(bfs+优先队列+状态压缩)
- sphinx做搜索时如果web服务器和sphinx服务器不是同一台服务器,返回false的原因说明
- Kernel PCA
- 【Spring Security实战系列】Spring Security实战(六)
- Spring mybatis maven的项目环境运行流程
- hdu 1243
- iOS 让HTML网页内容和图片自适应UIWebView的宽度
- 比赛5 总结
- JavaScript--我发现!原来你是这样的JS(1)
- ssh框架POi导入excel表格兼容excel2003和2007版本
- JavaScript的BOM对象window方法
- 获取int值的完整32位字符串(2)
- git submodule的使用
- Git使用笔记