首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

哪位高手能把这两道题解决了

2012-02-20 
谁能把这两道题解决了做了两道动态规划的ACM题目,感觉做对了,为什么不能通过???第一道:http://acm.nuaa.ed

谁能把这两道题解决了
做了两道动态规划的ACM题目,感觉做对了,为什么不能通过???
 第一道:http://acm.nuaa.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1022

下面是代码:
#include<iostream>
using namespace std;
int a[1000][1000];
int LCS(const char *s1, const char *s2)

int m = strlen(s1), n = strlen(s2);
cout<<m<<","<<n<<endl;
int i, j;
a[0][0] = 0;
for( i=1; i <= m; ++i ) a[i][0] = 0;
for( i=1; i <= n; ++i ) a[0][i] = 0;
for( i=1; i <= m; ++i )
for( j=1; j <= n; ++j )
{
if(s1[i-1]==s2[j-1]) a[i][j] = a[i-1][j-1]+1;
else if(a[i-1][j]>a[i][j-1])a[i][j]= a[i-1][j];
else a[i][j] = a[i][j-1];
}
return a[m][n];
}

int main()
{
char c[1000],s[1000];
while(cin.getline(c,1000,' ')&&cin.getline(s,1000))
{
cout<<LCS(c,s)<<endl;
}
return 0;
}

[解决办法]
cout<<m<<","<<n<<endl;

这句好像题目没有让你输出吧??
没参加过ACM,是不是应该严格按照需求做的?人家只让你输出长度而已

代码应该没问题
[解决办法]
第一个 输入哪行有问题 而且数组开的1000肯定不对 他串长度最多是1000 你数组至少要开到1001 
因为a[1000][1000]记录的是最长串 你开1000明显是要数组越界的

C/C++ code
#include<iostream>using namespace std;[color=#FF0000]int a[1024][1024];[/color]int LCS(const char *s1, const char *s2){  int m = strlen(s1), n = strlen(s2);//cout<<m<<","<<n<<endl;int i, j;a[0][0] = 0;for( i=1; i <= m; ++i ) a[i][0] = 0;for( i=1; i <= n; ++i ) a[0][i] = 0;for( i=1; i <= m; ++i )for( j=1; j <= n; ++j ){if(s1[i-1]==s2[j-1]) a[i][j] = a[i-1][j-1]+1;else if(a[i-1][j]>a[i][j-1])a[i][j]= a[i-1][j];else a[i][j] = a[i][j-1];}return a[m][n];}int main(){[color=#FF0000]char c[1024],s[1024];[/color][color=#FF0000]while(cin>>c>>s)[/color]{cout<<LCS(c,s)<<endl;}return 0;}
[解决办法]
第二个更简单了 典型背包 写了一个
C/C++ code
#include <stdio.h>#include <string.h>int main(){    int n,c,v,w,d[1024];    while(scanf("%d%d",&n,&c)==2)    {         memset(d,0,sizeof(d));         for(int i=0;i<n;i++)         {            scanf("%d%d",&v,&w);            for(int j=c;j>=w;j--)            if(d[j]<d[j-w]+v) d[j]=d[j-w]+v;                  }                                      printf("%d\n",d[c]);    }       return 0; }
[解决办法]
#include<iostream>
using namespace std;
int a[1024][1024];
int LCS(const char *s1, const char *s2)
{
int m = strlen(s1), n = strlen(s2);
//cout<<m<<","<<n<<endl;
int i, j;
a[0][0] = 0;
for( i=1; i <= m; ++i ) a[i][0] = 0;
for( i=1; i <= n; ++i ) a[0][i] = 0;
for( i=1; i <= m; ++i )
for( j=1; j <= n; ++j )
{
if(s1[i-1]==s2[j-1]) a[i][j] = a[i-1][j-1]+1;
else if(a[i-1][j]>a[i][j-1])a[i][j]= a[i-1][j];
else a[i][j] = a[i][j-1];
}
return a[m][n];
}

int main()
{
char c[1024],s[1024]; 
while(cin>>c>>s) 
{
cout<<LCS(c,s)<<endl;
}
return 0;
}

热点排行