传纸条 NOIP2008 c++编译错误求解决

传纸条 NOIP2008 c++编译错误求解决,第1张

#include<cstdio>

#include<cstring>

#include<iostream>

#include<string>

using namespace std

#define for_up(i,a,b) for(i=ai<=bi++)

#define for_down(i,a,b) for(i=ai>=bi--)

// 不能引用数组s,要传递指针

void change_max(int a[],int b[],int s[])

{

int c[40],i,j,x,t,len1,len2,len3,lens

len1=a[0]len2=b[0]lens=s[0]

memset(c,0,sizeof(c))

for_up(i,1,len1)

{

x=0

for_up(j,1,len2)

{

t=c[i+j-1]+a[i]*b[j]

c[i+j-1]=t % 10

x=t / 10

}

c[i+len2]+=x

}

len3=len1+len2+(x>0)

if (len3>lens) {s[0]=len3for_up(i,1,len3) s[i]=c[i]return}

if (len3<lens) return

for_down(i,lens,1)

if (c[i]>s[i]) {for_up(i,1,len3) s[i]=c[i]return}

else if (c[i]<s[i]) return

}

int main()

{

// 数组 a 太大,无法运行

int n,m,i,j,k,t,a[41][41][7][40]

string s

// 这里用换行错误的,因为输入数值时必然要换行的。

cin>>n>>m

cin>>s

memset(a,0,sizeof(a))

for_up(i,1,n)

{

for_up(j,i,n)

{

a[i][j][0][0]=j-i+1

// 这里的数组 s 用法错误

for_up(k,1,j-i+1) a[i][j][0][k]=s[i+k-1]-'0'

}

}

for_up(t,1,m)

for_up(i,1,n-1)

for_up(j,i+1,n)

{

// 数组 b 未定义,在程序中也无用,就注释掉了

//memset(b,0,sizeof(b))

for_up(k,i,j-1)

// 这里要传递第四维数组的首地址

change_max(&a[i][k][t-1][0],&a[k+1][j][t-1][0],&a[i][j][t][0])

}

for_down(i,a[i][n][k][0],1)

printf("%d",a[1][n][k][i])

return 0

}

f和f1是滚动数组。每一次dp之后,将结果传给f1,再用f1作为上一次的结果推导到f。

主程序用三维循环,以k(传给了k个人)为状态。f[i,j]就是走k步分别到第i行和第j行的最优解

check检查越界和判断路径是否重叠;

大致就是这样了,有什么不懂的还可以问我。。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11465817.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存