谁能把这两道题解决了
做了两道动态规划的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明显是要数组越界的
#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;}
[解决办法]
第二个更简单了 典型背包 写了一个
#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;
}