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);
}