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
",dp[len1-1][len2-1]);
    }
    return 0;
}

一切的原因是归在

cin>>list;

strlen(list+1);

上面,我也不知道其中编译器是怎么运行的

原文地址:https://www.cnblogs.com/dowson/p/3287592.html