zoukankan      html  css  js  c++  java
  • poj3280

    dp

    View Code
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    
    #define maxn 205
    #define maxm 2005
    #define inf 0x3f3f3f3f
    
    int n, m;
    char st[maxm];
    int cost[maxn];
    int f[maxm][maxm];
    
    void input()
    {
        scanf("%d%d", &n, &m);
        scanf("%s", st + 1);
        for (int i = 0; i < n; i++)
        {
            char ch[5];
            int a, b;
            scanf("%s%d%d", ch, &a, &b);
            cost[(int)ch[0]] = min(a, b);
        }
    }
    
    int work()
    {
        // f[i][j] = min(f[i - 1][j] + cost[i], f[i][j + 1] + cost[j])
        // f[i][j] = f[i - 1][j + 1]
        f[0][m + 1] = 0;
        for (int i = m; i > 0; i--)
            f[0][i] = cost[(int)st[i]] + f[0][i + 1];
        for (int i = 1; i <= m; i++)
            f[i][m + 1] = f[i - 1][m + 1] + cost[(int)st[i]];
        for (int i = 1; i < m; i++)
        {
            for (int j = m; j > i; j--)
            {
                f[i][j] = min(f[i - 1][j] + cost[(int)st[i]], f[i][j + 1]
                        + cost[(int)st[j]]);
                if (st[i] == st[j])
                    f[i][j] = min(f[i][j], f[i - 1][j + 1]);
            }
        }
        int ret = inf;
        for (int i = 1; i <= m; i++)
            ret = min(ret, f[i - 1][i + 1]);
        for (int i = 1; i < m; i++)
            ret = min(ret, f[i][i + 1]);
        return ret;
    }
    
    int main()
    {
        //freopen("t.txt", "r", stdin);
        input();
        printf("%d\n", work());
        return 0;
    }
  • 相关阅读:
    until循环
    linux的shell使用
    shell通配符(元字符)
    linu运算
    mail邮件
    linux命令
    redis笔记
    mysql 5.7安装方法
    mysql5.7.25搭建mysql-5.7.25.tar.gz包(亲验)
    mysql数据迁移
  • 原文地址:https://www.cnblogs.com/rainydays/p/2577987.html
Copyright © 2011-2022 走看看