class InsertionSortCount {
public:
int countMoves(vector <int> A) {
int r = 0;
for(int i=0; i<A.size(); ++i){
int idx = i;
int mn = 1 << 22;
for(int j=i; j<A.size(); ++j){
if(mn > A[j]){
mn = A[j];
idx = j;
}
}
if(i != idx){
r += idx - i;
A.erase( A.begin() + idx );
A.insert( A.begin() + i, mn );
}
}
return r;
}
};
500辞書順最小に作る方法が分からなかった。解説を読んだ。99ずつ引けばいいようだ。
class IndicatorMotionReverse {
public:
int diff(char a, char b){
string s = "-/|N";
return (s.find(a) - s.find(b) + 4) % 4;
}
string itoa(int n){
char buff[10];
sprintf(buff, "%02d", n);
return string( buff );
}
string getMinProgram(vector <string> act) {
string r, s;
r = s = "";
for(int i=0; i<act.size(); ++i){
s += act[i];
}
for(int i=1; i<s.size();){
int d = diff(s[i], s[i-1]);
int cnt = 0;
while(i<s.size() && diff(s[i], s[i-1]) == d){
++cnt;
++i;
}
char c = string("SLFR")[d];
string t = "";
while(99 < cnt){
t = "99" + t;
t = c + t;
cnt -= 99;
}
r += c + itoa(cnt) + t;
if(100 < r.size()){
return r.substr(0, 97) + "...";
}
}
return r;
}
};
1000int rec(int, int, string) 内で、k+=2ではなく、++kとしていて答えが出なかった。
const int N = 50 + 1;
int t[N][N];
class CorrectingParenthesization {
public:
int cost(char a, char b){
if(a == '(' && b == ')')return 0;
if(a == '{' && b == '}')return 0;
if(a == '[' && b == ']')return 0;
if(string("({[").find(a) != string::npos)return 1;
if(string(")}]").find(b) != string::npos)return 1;
return 2;
}
int rec(int i, int j, string s){
if( !(i < j) )return 0;
if(0 <= t[i][j])return t[i][j];
int r = rec(i+1, j-1, s) + cost(s[i], s[j]);
for(int k=i+1; k<j; k+=2){
r = min(r, rec(i, k, s) + rec(k+1, j, s));
}
return t[i][j] = r;
}
int getMinErrors(string s) {
fill( &t[0][0], &t[(int)s.size()][s.size()], -1 );
return rec(0, (int)s.size()-1, s);
}
};
0 件のコメント :
コメントを投稿