太智慧了
求多个数最大值:
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)\).

浙公网安备 33010602011771号