bool p(string s)
{
string t = s;
reverse( t.begin(), t.end() );
return s == t;
}
class Palindromize {
public:
string minAdds(string s) {
for(int i=0; i<s.size(); ++i){
string t = s.substr(i);
if( p(t) ){
t = s.substr(0, i);
reverse( t.begin(), t.end() );
return s + t;
}
}
return "@";
}
};
500BigIntは自作のクラス。
string itoa(int n)
{
ostringstream oss;
oss << n;
return oss.str();
}
class Multifactorial {
public:
string calcMultiFact(int N, int K) {
BigInt mx("1000000000000000000");
BigInt zero("0");
BigInt n( itoa(N) );
BigInt k( itoa(K) );
BigInt r("1");
while( zero < n ){
r = r * n;
n = n - k;
if( mx < r ){
return "overflow";
}
}
return r.toString();
}
};
1000const int N = 50 + 1;
double t[N][N];
double opt[N][N][N];
double rec(int begin, int end, int div)
{
if( div == 1 )return t[begin][end];
if( opt[begin][end][div] != -1 )return opt[begin][end][div];
double mn = 1e256;
for(int i=begin; i<end; ++i){
double a = rec(begin, i, div / 2) + rec(i+1, end, div - div / 2);
double b = rec(begin, i, div - div / 2) + rec(i+1, end, div / 2);
mn = min( mn, min(a, b) );
}
return opt[begin][end][div] = mn;
}
class MinimumVariancePartition {
public:
double minDev(vector <int> m, int k) {
fill( &opt[0][0][0], &opt[N-1][N-1][N], -1 );
sort( m.begin(), m.end() );
for(int i=0; i<m.size(); ++i){
for(int j=i+1; j<=m.size(); ++j){
double ave = 0;
for(int k=i; k<j; ++k){
ave += m[k];
}
ave /= (double)(j - i);
double sum = 0;
for(int k=i; k<j; ++k){
double n = (double)m[k] - ave;
sum += n * n;
}
t[i][j-1] = sum / (double)(j - i);
}
}
return rec(0, (int)m.size()-1, k);
}
};
0 件のコメント :
コメントを投稿