P1118 [USACO06FEB] Backward Digit Sums G/S

  • 1≤�≤12
  • 1≤sum≤12345

解题思路

这题的关键是先看出"不断相加"后的结果,本质上是一个加权和。

以 �=4 为例:

复制代码
a1   a2   a3   a4
  a1+a2   a2+a3   a3+a4
    a1+2a2+a3   a2+2a3+a4
      a1+3a2+3a3+a4

最后一行的系数是 1, 3, 3, 1,正好对应杨辉三角的一行。

继续推广可知,最终结果可以写成:

∑�=1���⋅�(�−1,�−1)

于是原题就转化成了:

排列 �1,�2,...,��,找到一个字典序最小的方案,使得

∑�=1���⋅�(�−1,�−1)=sum

所以整道题可以分成两步:

  1. 先预处理出杨辉三角,得到每一位对应的权值。
  2. 再用 DFS 枚举排列,计算当前加权和。

因为题目要求输出字典序最小的解,所以搜索时按 1 ~ n 的顺序枚举。这样第一个满足条件的方案就是答案。

剪枝

设当前已经填到第 idx 位,当前加权和为 cursum。

如果 cursum > sum,后面再怎么填也只会更大,就可以直接返回。

复杂度分析

  • 时间复杂度:最坏情况下为 �(�!⋅�)
    需要枚举排列,搜索过程中每个状态的转移是常数级,整体主要由全排列数量决定。
  • 空间复杂度:�(�2)
    其中杨辉三角需要 �(�2),递归栈、路径数组和标记数组需要 �(�)。
    n 的范围较小

代码实现

复制代码
#define rep(i,a,b) for(int i=(int)a;i<int(b);++i)

int n, num;
int c[15][15];     // 杨辉三角
int coef[15];      // 每一位的系数
int path[15];      // 当前排列
bool used[15];
bool found;

void init() {
    rep(i, 0, 13) {
        c[i][0] = c[i][i] = 1;
        rep(j, 1, i) {
            c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
        }
    }
}

void dfs(int idx, int cursum) {
    if (found) return;
    if (cursum > num) return;

    if (idx == n) {
        if (cursum == num) {
            rep(i, 0, n) cout << path[i] << " ";
            cout << '\n';
            found = true;
        }
        return;
    }

    rep(i, 1, n + 1) {
        if (used[i]) continue;
        used[i] = true;
        path[idx] = i;
        dfs(idx + 1, cursum + i * coef[idx]);
        used[i] = false;
    }
}

void solve() {
    init();
    cin >> n >> num;

    rep(i, 0, n) {
        coef[i] = c[n - 1][i];
    }

    dfs(0, 0);
}

易错点

  1. 杨辉三角的预处理
  2. DFS的使用
  3. 要按从小到大的顺序枚举,才能保证第一个找到的是字典序最小解。
  4. 剪枝条件写成 cursum > sum,不要漏掉。
相关推荐
万少7 分钟前
Qoder sonus模型 20分钟,复刻 马斯克 飞天汽车
前端·后端·算法
七牛云行业应用29 分钟前
Muse Spark Open 发布:Meta 称其为美国最强开放权重模型,816B 参数如何落地
算法
esop轻Mes看板亮灯分拣ESD静电安1 小时前
产线“最后一米”的破局密码:ESOP与MES的区别与深度协同
算法
陈天伟教授1 小时前
《数据处理和标注技术》课程能力图谱
人工智能·算法
LMT_Lanmantech1 小时前
HyperWorks许可:almutil显示Unit满了,数据到底准不准?
运维·服务器·算法
禁默1 小时前
论文解读与思考:基于场所地图的标识感知机器人探索方法及工程参考的价值
人工智能·深度学习·算法·机器人
维克兜率天1 小时前
【维克】统计套利建模:从因子到信号的完整流程
android·开发语言·python·算法·kotlin
Zentceh1 小时前
PixelClean 这类 AI 降噪算法是怎么工作的?从 RAW 域到 GAN 色彩重建的技术拆解
图像处理·人工智能·科技·算法·计算机视觉·车载系统·智能硬件
用户0390614707191 小时前
无感观测器理论模型(NTSM-SMO-PLL 与 SMO-PLL)
算法
垆边人似月.2 小时前
找出最小的 K 个数
数据结构·c++·算法