CCF201312 小结

出现次数最多的数

除了用数组下标储存值(a[x]=count)外,还可以使用map容器。map的函数包括容器都有的begin(),end(),clear(),size()等,本题使用迭代器遍历map,找出最大值:

    int maxn=0,ans;
    for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
        if(it->second>maxn){
            maxn=it->second;  //it->first,it->second分别表示关联中左侧的值和右侧的值
            ans=it->first;
        }
    }
ISBN号码

使用string读取输入再根据题意处理,做这道题的时候新建了一个数组用于储存正确的数字,但这个数组是多余的,只需要计算并修改输入的字符串就可以了。

最大的矩形

暴力,没有想到更佳的解决方法。遍历方式可以是长方形的宽,但更优的方式是遍历长方形的高。

有趣的数

1.读题应该仔细,做题时因为理解错题意浪费很多时间。
2.用动态规划解决问题时可以想国王开金矿的问题,画出状态关系的树,这样就很好理解了。本题通过推导条件可以得出开头数字一定是2等额外条件,在这基础上想到长度为n的数字可以理解为一个长度为n-1的数加一个数,从而寻找到其他状态,接着将得到的状态继续分解,找到边界状态,也就是一个只包含数字2的数字。(国王不能解决问题,就把金矿分成n-1和1,再将n-1个金矿的问题交给大臣,以此类推。)
这样自顶向下分析问题,再写程序由下向上得到答案。
虽然现在理解了做法,但是当时还是没做出。下次如果卡住了就想想国王和金矿,看能不能用动态规划求解。
代码:

#include<iostream>
#include<cstring>
using namespace std;
const long long mod=10^9+7;
long long dp[1005][6];
int main(){
    int n;cin>>n;
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++){
        dp[i][0]=1;
        dp[i][1]=(dp[i-1][1]+dp[i-1][0])%mod;
        dp[i][2]=(dp[i-1][0]+dp[i-1][2]*2)%mod;
        dp[i][3]=(dp[i-1][2]+dp[i-1][3]*2)%mod;
        dp[i][4]=(dp[i-1][4]*2+dp[i-1][1]+dp[i-1][2])%mod;
        dp[i][5]=(dp[i-1][5]*2+dp[i-1][3]+dp[i-1][4])%mod;
    } 
    cout<<dp[n][5];
} 
I'm stuck!

思路容易想出,但实现较难,主要原因是:
1.需要重复处理边界和方向判断,代码量较多
2.需要进行两次dfs,感觉有简化的实现方式,但不知道如何下手
3.做到这里耐心和专注度已经很少了,没法认真下来写好代码
后来参考标准答案写完代码,里面有很多可学习的地方:

#include<iostream>
#include<cstring>
using namespace std;
const int N=55;
struct _direct{   //用结构体处理方向 
    int dr,dc;
}direct[4]={{-1,0},{1,0},{0,-1},{0,1}};

char grid[N][N];
int vis1[N][N],vis2[N][N];

int R,C;

inline bool islegal(int r,int c){  //inline用于节约栈内存 
    return 0<=r&&r<R&&0<=c&&c<C&&!vis1[r][c]&&grid[r][c]!='#';
}

void dfs(int r,int c){
    vis1[r][c]=1;
    
    int nextr,nextc;
    if(grid[r][c]=='S'||grid[r][c]=='T'||grid[r][c]=='+'){
        for(int i=0;i<4;i++){      //*方向的处理方式 
            nextr=r+direct[i].dr;
            nextc=c+direct[i].dc;
            if(islegal(nextr,nextc))
                dfs(nextr,nextc);
        }
    }
    else if(grid[r][c]=='-'){
        for(int i=2;i<4;i++){
            nextr=r+direct[i].dr;
            nextc=c+direct[i].dc;
            if(islegal(nextr,nextc))
                dfs(nextr,nextc);
        } 
    }
    else if(grid[r][c]=='|'){
        for(int i=0;i<2;i++){
            nextr=r+direct[i].dr;
            nextc=c+direct[i].dc;
            if(islegal(nextr,nextc))
                dfs(nextr,nextc);
        } 
    }
    else if(grid[r][c]=='.')
        if(islegal(r+1,c))
            dfs(r+1,c);
}

int main(){
    int sr,sc,tr,tc;
    
    cin>>R>>C;
    for(int i=0;i<R;i++)
        cin>>grid[i];    //直接输入数组 
        
    for(int i=0;i<R;i++)
        for(int j=0;j<C;j++)
            if(grid[i][j]=='S')
                sr=i,sc=j;
            else if(grid[i][j]=='T')
                tr=i,tc=j;
                
    memset(vis1,0,sizeof(vis1));    //dfs中对vis1进行操作,所以这里要建立vis2储存vis1的信息 
    dfs(sr,sc);
    memcpy(vis2,vis1,sizeof(vis1));
    
    if(!vis1[tr][tc]) cout<<"I'm stuck!";
    else{
        int ans=0;
        for(int i=0;i<R;i++)
            for(int j=0;j<C;j++){
                if(vis2[i][j]){
                    memset(vis1,0,sizeof(vis1));
                    dfs(i,j);
                    if(!vis1[tr][tc])
                        ans++;
                }
            }
        cout<<ans;
    } 
}
总结

第一次做ccf,难度超过自己的能力,如果现在就去考的话应该分数不高。这五道题有很多可学习的点:
1.容器map的使用(m->first,m->second,iterator)
2.识别动态规划的方法:国王的金矿
3.创建结构体_direct处理方向的问题,创建islegal处理边界的问题,灵活使用dfs中的vis表(memcpy)
4.*耐心的实现代码
还有很多地方可以提高~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 1,742评论 0 2
  • 在理解动态规划、BFS和DFS一文中,只是初步讲解了一下动态规划,理解的并不到位,这里再加深理解一下。 本文主要参...
    小碧小琳阅读 11,143评论 1 11
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 1,460评论 0 2
  • 一.简述如何安装配置apache 的一个开源的hadoop 1.使用root账户登陆 2.修改ip 3.修改hos...
    栀子花_ef39阅读 4,932评论 0 52
  • 简述 极客时间算法40讲中所出现的leetcode算法题 题目 【链表】reverse-linked-list(反...
    BestbpF阅读 4,463评论 0 4