SRM515 Div2 Hard(1000) NewItemShopTwo

NewItemShopTwo

動的計画法。時刻ごと、それぞれの客が来たかどうかごとに最大期待値を覚えておく。

#include <string>
#include <vector>
#include <sstream>
using namespace std;

class NewItemShopTwo{public:
double getMaximum( vector <string> customers )
{
    double C[24][2] = {{0}};
    double P[24][2] = {{0}};

    for ( int i=0; i<2; i++ )
    {
        for ( int j=0; j<(int)customers[i].size(); j++ )
            if ( customers[i][j]==',' )
                customers[i][j] = ' ';
        stringstream ss(customers[i]);
        int t,c,p;
        int s = 100;
        while ( ss>>t>>c>>p )
            C[t][i] = c,
            P[t][i] = (double)p/s,
            s -= p;
    }

    double T[25][4] = {{0}};

    for ( int i=23; i>=0; i-- )
    for ( int j=0; j<4; j++ )
    {
        T[i][j] = T[i+1][j];
        for ( int k=0; k<2; k++ )
            if ( (j>>k&1)==0 && P[i][k]>0 )
                T[i][j] = max(T[i+1][j|1<<k],C[i][k]) * P[i][k]
                        + T[i+1][j] * (1-P[i][k]);
    }

    return T[0][0];
}};