SRM 531 SutTheBumbers

【分析】
一開始是直接想到用貪心的,因爲樣例是完全可以過的(要麼全是橫的,要麼全是豎的)。不過在用大數據跑的時候就發現了問題。貪心不行,難道我們真的要模擬怎麼分割這個矩形嗎?不說複雜度,關鍵是不會模擬啊。最後將目光聚集到小方塊上,一個方塊的狀態其實只有橫着的或豎着的,也就是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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章