• 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;
    }
  • 相关阅读:
    POJ3164 Command Network
    UVa11401 Triangle Counting
    UVa11174 Stand in a Line
    UVa11806 Cheerleaders
    Uva11538 Chess Queen
    Bzoj3130 [Sdoi2013]费用流
    Bzoj3262 陌上花开
    模拟25A 题解
    模拟24 题解
    模拟23 题解
  • 原文地址:https://www.cnblogs.com/rainydays/p/2577987.html
Copyright © 2020-2023  润新知