Contents

ARST打卡第348周

Algorithm

lc1411_给Nx3网格图涂色的方案数

思路:

这类题目都是递推优化,但是有点生疏了,学习一下题解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Solution {
private:
    static constexpr int mod = 1000000007;

public:
    int numOfWays(int n) {
        // 预处理出所有满足条件的 type
        vector<int> types;
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                for (int k = 0; k < 3; ++k) {
                    if (i != j && j != k) {
                        // 只要相邻的颜色不相同就行
                        // 将其以十进制的形式存储
                        types.push_back(i * 9 + j * 3 + k);
                    }
                }
            }
        }
        int type_cnt = types.size();
        // 预处理出所有可以作为相邻行的 type 对
        vector<vector<int>> related(type_cnt, vector<int>(type_cnt));
        for (int i = 0; i < type_cnt; ++i) {
            // 得到 types[i] 三个位置的颜色
            int x1 = types[i] / 9, x2 = types[i] / 3 % 3, x3 = types[i] % 3;
            for (int j = 0; j < type_cnt; ++j) {
                // 得到 types[j] 三个位置的颜色
                int y1 = types[j] / 9, y2 = types[j] / 3 % 3, y3 = types[j] % 3;
                // 对应位置不同色,才能作为相邻的行
                if (x1 != y1 && x2 != y2 && x3 != y3) {
                    related[i][j] = 1;
                }
            }
        }
        // 递推数组
        vector<vector<int>> f(n + 1, vector<int>(type_cnt));
        // 边界情况,第一行可以使用任何 type
        for (int i = 0; i < type_cnt; ++i) {
            f[1][i] = 1;
        }
        for (int i = 2; i <= n; ++i) {
            for (int j = 0; j < type_cnt; ++j) {
                for (int k = 0; k < type_cnt; ++k) {
                    // f[i][j] 等于所有 f[i - 1][k] 的和
                    // 其中 k 和 j 可以作为相邻的行
                    if (related[k][j]) {
                        f[i][j] += f[i - 1][k];
                        f[i][j] %= mod;
                    }
                }
            }
        }
        // 最终所有的 f[n][...] 之和即为答案
        int ans = 0;
        for (int i = 0; i < type_cnt; ++i) {
            ans += f[n][i];
            ans %= mod;
        }
        return ans;
    }
};

优化版本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Solution {
private:
    static constexpr int mod = 1000000007;

public:
    int numOfWays(int n) {
        int fi0 = 6, fi1 = 6;
        for (int i = 2; i <= n; ++i) {
            int new_fi0 = (2LL * fi0 + 2LL * fi1) % mod;
            int new_fi1 = (2LL * fi0 + 3LL * fi1) % mod;
            fi0 = new_fi0;
            fi1 = new_fi1;
        }
        return (fi0 + fi1) % mod;
    }
};

Review

Curiosity Is Compound Interest for Your Brain

  • 对某件事情的好奇心探索的反馈迭代,可以让人保持热情,形成复利。
  • 熟悉热爱的事情和不熟悉不热爱的事情交叉做,从而让人完成掉不得不做的不熟悉不热爱的事情。
  • 利用AI解决繁琐的事情,然后自己专注于知识学习中各种知识网络连接的部分。

Tip

Web3 招聘求职 2025 年终回顾:谁在赚钱,谁在付费打工 ?

可以看出来,国语用户在工资上还有巨大的提升空间,所以保持探索,day1global。

Share_Antigravity爽退cursor

Antigravity相对cursor的优劣:

  1. Antigravity的Sonnet4.5Thinking不用开特定地区的全局虚拟网卡才能用,虐了cursor
  2. Antigravity的各种ui细节虐了cursor
  3. cursor的自动补全内容上还是比Antigravity牛逼
  4. Antigravity的Sonnet4.5Thinking不会像cursor那样动不动就创建过多的总结文档消耗用户token,虐了cursor
  5. Antigravity Pro 5小时更新一次配额,而 cursor Pro需要一个月一次,虐了cursor
  6. Antigravity 对多Agent模式,多workspace协同和网页浏览模式支持得更自然,虐了cursor
  7. Antigravity 的planning模式可以任意点评,不像cursor那样只有指定选择题
  8. cursor能够直接结果复制markdown格式,而Antigravity没有复制键
  9. Antigravity 完美继承cursor里面的vim的自定义的按键配置,比cursor继承不了vscode的vim自定义配置好多了。
  10. Antigravity 的终端运行以及ssh连接vps运行都比cursor流畅,不会用sandbox把自己卡死。
  11. cursor缺省设置了中文回复,但是Antgravity没有,默认英文回复我的。
  12. cursor中断概率好像没Antgravity那么高。

整体优过点远大于不足点,所以退订cursor,转投Antigravity Pro,舒服了。