| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1676 人关注过本帖
标题:求解PKU 1185 炮兵阵地问题
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
很久没见这类有趣的问题了。让我想起了以前小曹发过的瓷砖问题。

在看别人的答案之前,我习惯先自己解决(思考,不正是玩ACM的乐趣么),晚一点和大家交流。

最近工作比较忙,不能天天来论坛玩,各位朋友见谅。

重剑无锋,大巧不工
2012-03-26 09:12
C_戴忠意
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:575
专家分:1349
注 册:2011-10-21
收藏
得分:0 
境界不够丶继续修炼

编程之路定要走完……
2012-03-26 10:15
hf201089
Rank: 2
等 级:论坛游民
帖 子:48
专家分:25
注 册:2012-3-4
收藏
得分:0 
自己顶下
2012-03-26 22:53
Eilliot
Rank: 6Rank: 6
等 级:侠之大者
帖 子:41
专家分:418
注 册:2012-3-26
收藏
得分:0 
楼主是高人嘛    可不可以说说想法?
2012-03-26 22:54
hf201089
Rank: 2
等 级:论坛游民
帖 子:48
专家分:25
注 册:2012-3-4
收藏
得分:0 
回复 14楼 Eilliot
求教贴。。
我也不会额
2012-03-27 12:43
Eilliot
Rank: 6Rank: 6
等 级:侠之大者
帖 子:41
专家分:418
注 册:2012-3-26
收藏
得分:0 
太BTle
2012-03-27 12:44
君莫笑
Rank: 2
等 级:论坛游民
帖 子:22
专家分:58
注 册:2012-3-2
收藏
得分:0 
虚心求教
2012-03-27 15:32
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
好吧,今天晚上写一篇详细的解析
2012-03-27 15:36
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:100 
小曹过了吗?
有点郁闷,所有能想到的数据都测试过了,讨论区的数据也测试了一遍,但提交就是WA,呵呵。
不太爽,先把这段WA代码放上来给大家点评吧。


程序代码:
#include<stdio.h>
int ls[60];
int lc[60];
char lm[60][60];

int is_right(int s)
{
    for(; s; s >>= 1)
    if(s & 1 && s & 6) return 0;
    return 1;
}

int count(int s)
{
    int c;
    for(c = 0; s; c++) s &= s - 1;
    return c;
}

void initial()
{
    int i, j;
    for(j = i = 0; i < 586; i++)
        if(is_right(i)) lc[j] = count(ls[j] = i), j++;
    for(lm[0][0] = 1, i = 0; i < 60; i++)
    for(j = i + 1; j < 60; j++) lm[i][j] = lm[j][i] = (ls[i] & ls[j]) == 0;
}

int cal(int *map, int n, int m)
{
    int a[2][60][60] = {0}, (*f)[60] = a[0], (*p)[60] = a[1], (*t)[60];
    int w, i, j, k, r, c;
    for(w = 1 << m, i = 59; i > 0 && ls[i] >= w; i--); w = i;
    for(i = 0; i < n; i++, t = p, p = f, f = t)
    {
        for(j = 0; j <= w; j++)
        {
            if(ls[j] & map[i])
            {
                for(k = 0; k <= w; p[j][k++] = -1);
                continue;
            }
            for(k = 0; k <= w; p[j][k++] = c)
            {
                if(!lm[j][k]){ p[j][k] = -1; continue; }
                for(c = -1, r = 0; r <= w; r++)
                if(f[k][r] >= 0 && lm[j][r] && f[k][r] + lc[j] > c) c = f[k][r] + lc[j];
            }
        }
    }
    for(c = i = 0; i <= w; i++)
    for(j = 0; j <= w; j++)
    if(f[i][j] > c) c = f[i][j];
    return c;
}

int main()
{
    char str[32];
    int map[256], n, m, i, j;
    initial();
    scanf("%d%d", &n, &m);
    for(i = 0; i < n; i++)
    {
        scanf("%s", str);
        map[i] = 0;
        for(j = 0; j < m; j++)
            map[i] = (map[i] << 1) + (str[j] == 'H');
    }
    printf("%d\n", cal(map, n, m));
    return 0;
}

重剑无锋,大巧不工
2012-03-27 18:05
kingofhevil
Rank: 1
等 级:新手上路
帖 子:37
专家分:6
注 册:2012-3-7
收藏
得分:0 
这种帖子确实好,理论用于实际,顶起
2012-03-28 12:54
快速回复:求解PKU 1185 炮兵阵地问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053883 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved