社区讨论
时间复杂度离奇改变
P2374搬运工参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi4hl3s2
- 此快照首次捕获于
- 2025/11/18 19:24 4 个月前
- 此快照最后确认于
- 2025/11/18 19:24 4 个月前
原来脑残多设了一维,发觉没有什么卵用,原先代码:
CPP#include<cstdio>
#include<algorithm>
using namespace std;
int a[110],b[110],c[110];
int f[110][110][110][3];
int main(){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
for(int i=0;i<x;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<=(x-1)/2;i++){
swap(a[i],a[x-i-1]);
}
for(int i=0;i<y;i++){
scanf("%d",&b[i]);
}
for(int i=0;i<=(y-1)/2;i++){
swap(b[i],b[y-i-1]);
}
for(int i=0;i<z;i++){
scanf("%d",&c[i]);
}
for(int i=0;i<=(z-1)/2;i++){
swap(c[i],c[z-i-1]);
}
for(int i=0;i<=x;i++){
for(int j=0;j<=y;j++){
for(int k=0;k<=z;k++){
if(i){
f[i][j][k][0]=max(f[i-1][j][k][0],max(f[i-1][j][k][1],f[i-1][j][k][2]))+(i+j+k)*a[i-1];
}
if(j){
f[i][j][k][1]=max(f[i][j-1][k][0],max(f[i][j-1][k][1],f[i][j-1][k][2]))+(i+j+k)*b[j-1];
}
if(k){
f[i][j][k][2]=max(f[i][j][k-1][0],max(f[i][j][k-1][1],f[i][j][k-1][2]))+(i+j+k)*c[k-1];
}
}
}
}
int n=max(f[x][y][z][0],max(f[x][y][z][1],f[x][y][z][2]));
printf("%d",n);
return 0;
}
修改后:
CPP#include<cstdio>
#include<algorithm>
using namespace std;
int a[110],b[110],c[110];
int f[110][110][110];
int main(){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
for(int i=0;i<x;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<=(x-1)/2;i++){
swap(a[i],a[x-i-1]);
}
for(int i=0;i<y;i++){
scanf("%d",&b[i]);
}
for(int i=0;i<=(y-1)/2;i++){
swap(b[i],b[y-i-1]);
}
for(int i=0;i<z;i++){
scanf("%d",&c[i]);
}
for(int i=0;i<=(z-1)/2;i++){
swap(c[i],c[z-i-1]);
}
for(int i=0;i<=x;i++){
for(int j=0;j<=y;j++){
for(int k=0;k<=z;k++){
if(i){
f[i][j][k]=max(f[i-1][j][k],max(f[i-1][j][k],f[i-1][j][k]))+(i+j+k)*a[i-1];
}
if(j){
f[i][j][k]=max(f[i][j][k],max(f[i][j-1][k],max(f[i][j-1][k],f[i][j-1][k]))+(i+j+k)*b[j-1]);
}
if(k){
f[i][j][k]=max(f[i][j][k],max(f[i][j][k-1],max(f[i][j][k-1],f[i][j][k-1]))+(i+j+k)*c[k-1]);
}
}
}
}
printf("%d",f[x][y][z]);
return 0;
}
为什么由163ms提高到3ms,时间复杂度应该没变啊,差这么多?!
回复
共 4 条回复,欢迎继续交流。
正在加载回复...