hdu1243反恐训练营
之前卡了我很久,结果今天一看,原来是最长相同序列,这坑爹的,被题目吓到了啊
不过呢,我还是不知道自己错在哪里,网上跟差不多的代码,结果我错了啊
还有没有出示数据的题目都是耍流氓....耍流氓
作为一道最长相同序列,我做错了,关键的两个for我都是从0开始的,不过在数据上是通过了啊,结果呢,wrong answer
#include "iostream" #include "string.h" using namespace std; int max(int a,int b){return a>b?a:b;} int dp[2005][2005]; int main(){ char list[2005],list1[2005],list2[2005]; int num[2005],n,i,a,j,len1,len2; while(cin>>n){ cin>>list; for(i=0;i<n;i++){ cin>>a; num[list[i]]=a; } cin>>list1>>list2; len1=strlen(list1); len2=strlen(list2); for(i=0;i<len1;i++)dp[i][0]=0; for(j=0;j<len2;j++)dp[0][j]=0; for(i=0;i<len1;i++){ for(j=0;j<len2;j++){ if(list1[i]==list2[j])dp[i][j]=dp[i-1][j-1]+num[list1[i]]; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); //cout<<dp[i][j]<<' '; } //cout<<endl; } cout<<dp[len1-1][len2-1]<<endl; } return 0; }
看看人家的代码呢?结果是accept,但是数据上呢,是wrong answer,不知道是什么情况来的
#include <stdio.h> #include <string.h> int dp[2005][2005],ar[2005]; int max(int x,int y) { return x>y?x:y; } int main() { int n,a,len1,len2,i,j; char str[2005],ans1[2005],ans2[2005]; while(scanf("%d",&n)!=EOF) { scanf("%s",str); for (i=0;i<n;i++) { scanf("%d",&a); ar[str[i]]=a; } scanf("%s%s",ans1+1,ans2+1); len1=strlen(ans1); len2=strlen(ans2); for (i=0;i<len1;i++)dp[i][0]=0; for (j=0;j<len2;j++)dp[0][j]=0; for (i=1;i<len1;i++) { for (j=1;j<len2;j++) { if(ans1[i]==ans2[j])dp[i][j]=dp[i-1][j-1]+ar[ans1[i]]; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } printf("%d\n",dp[len1-1][len2-1]); } return 0; }
一切的原因是归在
cin>>list;
strlen(list+1);
上面,我也不知道其中编译器是怎么运行的