hdu1243

来源:互联网 发布:日历js脚本 编辑:程序博客网 时间:2024/06/06 20:39

这题就是求最长公共子序列。dp[][]开2000*2000wa了我n次,改成2005果断就过了,所以要注意数组大小,其他倒是没什么可说的,上代码

<span style="font-size:18px;">#include<iostream>#include<cstring>#include<cstdio>using namespace std;int dp[2005][2005];int Max(int a,int b){return a>b?a:b;}int main(){char zidan[2005];char konbu[2005];char arr[2005];int count[200];int n;while(cin>>n){scanf("%s",arr);int k;for(int i=0;i<n;i++){scanf("%d",&k);count[arr[i]]=k;}for(int i=0;i<2000;i++){dp[0][i]=0;dp[i][0]=0;}scanf("%s",zidan);scanf("%s",konbu);int len1=strlen(zidan);int len2=strlen(konbu);int maxx=0;for(int i=1;i<=len1;i++){for(int j=1;j<=len2;j++){if(zidan[i-1]==konbu[j-1]){dp[i][j]=dp[i-1][j-1]+count[konbu[j-1]];}else{dp[i][j]=Max(dp[i][j-1],dp[i-1][j]);}if(maxx<dp[i][j])maxx=dp[i][j];}}cout<<maxx<<endl;}return 0;}</span>
上面代码还可以小小优化一下,就是初始化dp,可以先输入字符串,只初始化字符串大小的dp就行了,不过这里不想改了,就这样也只跑了240+ms。还有一点要提醒,不要用memset,否则你懂得,TLE会等着你。

0 0
原创粉丝点击