topcoder srm 497 div2 500
(2011-02-18 15:31:30)
标签:
topcodersrm497div2500it |
分类: Topcoder |
题目描述:
给你一个字符串s,长度为n(n<= 50),这个字符串对应着一个长度为n+1的数列ans,字符串和数列下标均从0开始。
字符串只有2种字符:
如果s[i] = D,表示ans[i] > ans[i+1]
如果s[i] = I, 表示ans[i] < ans[i+1]
求这个数列的最小字典序。
例子:
"IIIII"
Returns: {1, 2, 3, 4, 5, 6 }
"DI"
Returns: {2, 1, 3 }
"IIIID"
Returns: {1, 2, 3, 4, 6, 5 }
"DIIDID"
Returns: {2, 1, 3, 5, 4, 7, 6 }
解题报告:
方法一,自己想的,代码长:
首先,通过相邻两个数字的大小关系,利用floyd原理,可以得到尽可能多的两两之间的大小关系。
然后构有向图:i到j有一条边,说明ans[i]<ans[j],利用top排序的方法,把他们排序,注意,当有同时有多个入度为0的节点时,没有大小的关系的两个节点之间,编号小的考前,这样便满足的字典序。
拍完序后,一次从小到大编号即可,代码如下:
#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
int g[100][100];
struct node
{
};
class PermutationSignature {
public:
int n;
int rd[100], que[1000];
bool vst[100];
vector <int> reconstruct(string
s)
{