社区讨论

时间复杂度离奇改变

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 条回复,欢迎继续交流。

正在加载回复...