• Bribe the Prisoners yongmou


    这个题来自Codejam的Round 1C 2009 的C题。

    题意:

    连续编号i..j个牢房,每个牢房最初住着一个犯人。释放犯人k时,需要bribe犯人k两边的犯人,直到遇见空牢房或者边界。

    输入,是一个释放犯人序列。

    求,最小 bribe的金币。

    和最优二叉查找树差不多的DP。

    找到中间那个划分点,把问题分为两个子问题。显然构成最优子结构。

    /*
    动态规划
    cost(i, j)
    = min{cost(i, k) + cost(k, j) + pos[j] - pos[i] -2} , i < k < j
    */
    #include
    <stdio.h>
    #include
    <limits.h>

    #define MAX 110
    int cost[MAX][MAX]; // DP空间
    int pos[MAX]; // 位置

    void run_case(int no)
    {
    int i, j, k, s;
    int P, Q;
    scanf(
    "%d %d", &P, &Q);
    pos[
    0] = 0;
    for (i = 1; i <= Q; ++i)
    scanf(
    "%d", &pos[i]);
    pos[Q
    +1] = P + 1;
    // 初始化
    for (i = 0, j = 1; j <= Q + 1; ++i, ++j)
    cost[i][j]
    = 0;
    for (s = 2; s <= Q + 1; ++s) {
    for (i=0, j=s; j <= Q+1; ++i, ++j) {
    cost[i][j]
    = INT_MAX;
    int tmp;
    for(k=i+1; k < j; ++k) {
    tmp
    = cost[i][k] + cost[k][j] + pos[j] - pos[i] - 2;
    if (tmp < cost[i][j])
    cost[i][j]
    = tmp;
    }
    }
    }
    printf(
    "Case #%d: %d\n", no, cost[0][Q+1]);
    }

    int main()
    {
    int i, N;
    scanf(
    "%d", &N);
    for (i=1; i <= N; ++i)
    run_case(i);
    return 0;
    }

  • 相关阅读:
    四则运算————javaweb版
    构建之法阅读笔记02
    十一周学习进度条
    软工概论-课堂练习:添加信息
    梦断代码阅读笔记01
    链接doc命令行的mysql的编码问题
    构建之法阅读笔记01
    第十周学习进度条
    web
    sql初——基础
  • 原文地址:https://www.cnblogs.com/liyongmou/p/2060985.html
Copyright © 2020-2023  润新知