【分析】
一開始是直接想到用貪心的,因爲樣例是完全可以過的(要麼全是橫的,要麼全是豎的)。不過在用大數據跑的時候就發現了問題。貪心不行,難道我們真的要模擬怎麼分割這個矩形嗎?不說複雜度,關鍵是不會模擬啊。最後將目光聚集到小方塊上,一個方塊的狀態其實只有橫着的或豎着的,也就是0、1序列。這就想到了狀壓。接下來就是模擬的事情了。
【代碼】
bool mk[6][6];
class CutTheNumbers {
public:
int maximumSum(vector <string> a) {
int n=a.size();
int m=a[0].length();
int ans=0;
int i,j,p,q;
for(p=0;p<(1<<(n*m));p++){
int an=0;
memset(mk,0,sizeof(mk));
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(mk[i][j])continue;
if((1<<(i*m+j))&p){//是橫着的
int w=0;
for(q=j;q<m&&!mk[i][q];q++){
if((1<<(i*m+q))&p){
w=w*10+a[i][q]-'0';
mk[i][q]=1;
}
else break;
}
an+=w;
}
else{
int w=0;
for(q=i;q<n&&!mk[q][j];q++){
if(!(((1<<(q*m+j))&p))){
w=w*10+a[q][j]-'0';
mk[q][j]=1;
}else break;
}
an+=w;
}
}
}
ans=max(ans,an);
}
return ans;
}
};