UVALive 4961

原创 2013年12月05日 18:44:42

题意:给你一个字符串,告诉你两个字符会合成的字符和代价,问最后字符串合成一个字符所需的最下代价。如果合成的两个字符代价一样,那么取较前给出的字符。

f[i][j][k]:i到j这段区间合成k的最小代价

注意最后一个case 不要输出换行。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define VI vector<int>
#define pii pair<int,int>
#define LL long long
#define DB double
using namespace std;
const int MAXN = 210;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double eps = 1e-10;

char c[30],buf[MAXN];;
int id[300],f[MAXN][MAXN][30];
int mat[MAXN][MAXN];
vector<pii > b[30];
int main()
{
    bool flag = false;
    int n;
    while(scanf("%d",&n) && n){
        if(!flag) flag = true;
        else printf("\n");
        for(int i = 0; i < n;i++){
            b[i].clear();
            char s[10];
            scanf("%s",s);
            c[i] = s[0];
            id[c[i]] = i;
        }
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                char goal[2];
                int cost;
                scanf("%d-%s",&cost,goal);
                mat[i][j] = cost;
                b[id[goal[0]]].pb(mp(i,j));
            }
        }
        int m;scanf("%d",&m);
        for(int q = 0; q < m; q++){
            scanf("%s",buf);
            int len = strlen(buf);
            memset(f,INF,sizeof(f));
            for(int k = 0; k < n; k++)
                for(int i = 0; i < len;i++)
                    if(id[buf[i]] == k) f[i][i][k] = 0;
            for(int r = 1; r < len; r++)
                for(int l = r - 1; l >= 0; l--)
                    for(int k = 0; k < n;k++)
                        for(int mid = l;mid < r; mid++)
                            for(int i = 0; i < (int)b[k].size();i++){
                                int x = b[k][i].fi;
                                int y = b[k][i].se;
                //                cout<<x<<' '<<y<<endl;
                                f[l][r][k] = min(f[l][mid][x] + f[mid+1][r][y] + mat[x][y],f[l][r][k]);
                //                cout<<l<<' '<<mid<<' '<<r<<' '<<k<<' '<<f[l][r][k]<<endl;
                            }
            int ans = INF,cid = 0;
            for(int k = 0; k < n;k++){
                if(f[0][len-1][k] < ans){
                    ans = f[0][len-1][k];
                    cid = k;
                }
            }
            printf("%d-%c\n",ans,c[cid]);
        }
      //  printf("\n");
    }
    return 0;
}


UVALive - 4043 Ants (KM裸题)

题目大意:给出N只蚂蚁和N棵树的坐标,问如何完美匹配,才能使蚂蚁到树的连线不会相交解题思路:KM裸题,但是很郁闷啊 不开根号,用long long竟然过不了,很无语啊,距离最大只有8亿啊 然后用A...
  • L123012013048
  • L123012013048
  • 2015年08月06日 17:48
  • 776

uvalive 4671 - K-neighbor substrings 快速傅利叶变换

题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_proble...
  • u012183589
  • u012183589
  • 2015年09月26日 10:16
  • 841

【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns

UVAlive 4670 Dominating Patterns     题目:   Dominating Patterns   Time Limit: 3000MS ...
  • hahalidaxin
  • hahalidaxin
  • 2016年03月30日 17:20
  • 365

UVALive 6437

题意:给你n个点,m条边,k个可以发电的地方,wenni
  • u011743499
  • u011743499
  • 2014年08月11日 11:08
  • 485

UVAlive 7503

题意:你有a(0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50)钱,有一个机器,在这个机器上,你可以花任意的钱,然后它会把零钱以不确定的方式吐出...
  • zjbh89757
  • zjbh89757
  • 2016年08月02日 20:42
  • 791

UVALive 7040 (容斥)

题意:n朵花,从m种颜色中选择k种颜色使得相邻花不同色的方案数. 对于比较小的数据,这道计数题可以用DP做,DP[i][j]表示染i朵花用了j种颜色的方案数,那么对于后i-1朵花,要么用了j种颜色,要...
  • morejarphone
  • morejarphone
  • 2016年03月13日 22:31
  • 366

[组合数]UVALive7040

知识点: 组合数学-容斥原理,快速幂,逆元。 题目大意: 共有m 种颜色,为n盆排成一直线的花涂色。要求相邻花的颜色不相同,且使用的颜色恰好是k种。问一共有几种涂色方案(结果...
  • a197p
  • a197p
  • 2015年09月04日 11:13
  • 766

Uva 6437 - Power Plant 裸最小生成树

题意:                           一个无向图中(至多100个点),..每条边有其费用...有些点是发电站..现在要求所有的点都可以达到至少一个发电站..所需的最小费用.. ...
  • kk303
  • kk303
  • 2013年12月01日 22:49
  • 1191

UVALive7045 Last Defence(GCD思想)

题意: S0=A,S1=B,Sn=|Sn-1-Sn-2| 输入A,B求S序列中有几个不同的数 思路: 随便先写一组A,B会发现最后会出现0 其实分析一下会发现,首先默认B>A那么 S1=B=KA+r...
  • ftx456789
  • ftx456789
  • 2017年08月05日 16:29
  • 346

UVALive 4882 Parenthesis 删除不必要的括号 模拟题

题目链接:点击打开链接 题意:给定一个合法的序列,删掉所有不必要的括号。 #include #include const int MAX_N = 10007; char a[MAX...
  • qq574857122
  • qq574857122
  • 2014年09月05日 23:50
  • 1135
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVALive 4961
举报原因:
原因补充:

(最多只允许输入30个字)