nikeeshi のコーディング記

コーディングの成果をはっつけるとこ。このブログにあるソースコードはNYSL Version 0.9982に従い公開します(2014/06/18)。

SRM 580 Div2 1000

1000通した dpする配列は初めに-infで初期化しないとだめというのと、infがオーバーフローしないように木尾つけないとダメというのでした。

#include <vector>
#include <string>
using namespace std;
class WallGameDiv2{
public:
    const static int inf=10000000;
    int play(vector <string> input){
        int H=input.size();
        int W=input[0].size();
        vector<vector<int> >costs(H,vector<int>(W));
        for(int i=0;i<H;i++)
            for(int j=0;j<W;j++){
                if(input[i][j]=='x')
                    costs[i][j]=-inf;
                else costs[i][j]=input[i][j]-'0';
            }
        vector<int> maxcost(W,-inf);
        maxcost[0]=0;
        for(int i=0;i<H-1;i++){
            vector<int> nextmaxcost(W,-inf);
            for(int j=0;j<W;j++){
                int cost=0;
                for(int k=j;k>=0;k--){
                    cost+=costs[i][k];
                    nextmaxcost[j]=max(nextmaxcost[j],cost+maxcost[k]);
                }
                cost=0;
                for(int k=j;k<W;k++){
                    cost+=costs[i][k];
                    nextmaxcost[j]=max(nextmaxcost[j],cost+maxcost[k]);
                }
            }
            maxcost=nextmaxcost;
            for(int i=0;i<W;i++){
                if(maxcost[i]<-inf/2)
                    maxcost[i]=-inf;
            }
        }
        int ret=-inf;
        for(int i=0;i<W;i++){
            ret=max(ret,maxcost[i]+costs[H-1][i]);
        }
        return ret;
    }
};

int main(){
    string input[14]={"098x2486802x60", "7168x921174745", "04105247944809", "10411041514x66", "4136633475627x", "2753x082345656", "80286178590860", "59509x905533x2", "11446184126932", "9335610511x898", "32986168x98938", "08376282645973", "16469165478488", "9960619848956x"};
    vector<string> v;
    for(int i=0;i<14;i++)
        v.push_back(input[i]);
    WallGameDiv2 w;
    w.play(v);
}