#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检查越界和判断路径是否重叠;
大致就是这样了,有什么不懂的还可以问我。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)