AOJ 0525 Osenbei【穷竭搜索】
生活随笔
收集整理的這篇文章主要介紹了
AOJ 0525 Osenbei【穷竭搜索】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
AOJ 0525
題意:
有一個烤餅器可以烤r行c列的煎餅,煎餅可以正面朝上(用1表示)也可以背面朝上(用0表示)。一次可將同一行或同一列的煎餅全部翻轉。現在需要把盡可能多的煎餅翻成正面朝上,問最多能使多少煎餅正面朝上?
輸入:多組輸入,每組第一行為二整數r, c (1 ≤ r ≤ 10, 1 ≤ c ≤ 10 000),剩下r行c列表示煎餅初始狀態。r=c=0輸入結束
輸出:對于每組輸入,輸出最多能使多少煎餅正面朝上
這個是二維的窮舉,因為列數比較多行數比較少,所以可對行做dfs窮舉所有行的情況。這里用bitset保存每一行的情況,對于行的翻轉,只需要用自帶的flip函數。對于每一行都確定動作時,統計每一列翻時會出現的正面朝上的值以及不翻時的值,取較大數。此時,行動作確定時,列動作可以做到的最優值。因此窮舉所有行情況即可求出實際最優值。
#include<iostream> #include<algorithm> #include<string.h> #include<cstring> #include<vector> #include<set> #include<stack> #include<bitset> using namespace std;const int MAX_R=10; const int MAX_C=10000;int R,C,ans; bitset<MAX_C> a[MAX_R];void dfs(int k) {if(k==R){int result=0;for(int i=0;i<C;i++){int sum=0;for(int j=0;j<R;j++){if(a[j][i])sum++;}result+=max(sum,R-sum);}ans=max(ans,result);return;}dfs(k+1);//without flippinga[k].flip();dfs(k+1);//with flipping }int main() {while(cin>>R>>C&&R&&C){for(int i=0;i<R;i++)for(int j=0;j<C;j++){bool tmp;cin>>tmp;a[i][j]=tmp;}ans=0;dfs(0);cout<<ans<<endl;}return 0; }轉載于:https://www.cnblogs.com/demian/p/6555258.html
總結
以上是生活随笔為你收集整理的AOJ 0525 Osenbei【穷竭搜索】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql中的in和find_in_se
- 下一篇: vim插件之cscope的安装与配置