太智慧了

求多个数最大值:

max({......});

转换成滚动数组

将数组第一维改为2,在每次循环开始前清空下数组,每个第一维都与上一个1。

修改后

int f[2][4];

for (int i = 1; i <= n; i ++ )
{
    memset(f[i + 1 & 1], 0, sizeof f[0]);
    for (int j = 0; j < 4; j ++ )
        for (int k = 0; k < 4; k ++ )
            f[i + 1 & 1][k] = (f[i + 1 & 1][k] + f[i & 1][j] * g[j][k]) % MOD;
}

printf("%d\n", f[n + 1 & 1][0]);

修改前

int f[N][4];

for (int i = 1; i <= n; i ++ )
{
    for (int j = 0; j < 4; j ++ )
        for (int k = 0; k < 4; k ++ )
            f[i + 1][k] = (f[i + 1][k] + f[i][j] * g[j][k]) % MOD;
}

printf("%d\n", f[n + 1 & 1][0]);

减小常数

尽量将乘法改成加法。

把数字n分配到m个盒子里面

\[ C(n + m - 1, n - 1) \]

种方法进行分配

n个坐标之间最大的曼哈顿距离

暴力算法是\(O(n^2)\)的,智慧方法得到的答案就是

\[ t1 = max(\sum_{i = 0}^{n - 1} (x_i + y_i)) - min(\sum_{i = 0}^{n - 1} (x_i + y_i)) \\ t2 = max(\sum_{i = 0}^{n - 1} (x_i - y_i)) - min(\sum_{i = 0}^{n - 1} (x_i - y_i)) \\ \]

答案就是\(max(t1,t2)\).

posted @ 2023-02-06 22:12  Uzhia  阅读(20)  评论(0)    收藏  举报