方格选数

这里写图片描述

dfs

#include<stdio.h>
#include<windows.h>
int dig[][5]={{3,4,5,7,6},
            {6,2,8,4,12},
            {7,12,4,8,3},
            {1,9,5,10,7},
            {8,5,6,5,2},
            };
int f[5][5];
int g[10];
int max=-1;
void dfs(int i,int j,int sum,int step){
    if(sum<=24){
        int z = 1;
        for(int t = 0;t<step;t++)
            z*=g[t];
        if(z>max)   max=z;
    }else if(sum>24)return;
    if(j+1<5&&!f[i][j+1]){
        f[i][j+1]=1;
        g[step] = dig[i][j+1];
        dfs(i,j+1,sum+g[step],step+1);
        g[step]=f[i][j+1]=0;
    }
    if(i+1<5&&!f[i+1][j]){
        f[i+1][j]=1;
        g[step] = dig[i+1][j];
        dfs(i+1,j,sum+g[step],step+1);
        g[step]=f[i+1][j]=0;
    }
    if(j-1>=0&&!f[i][j-1]){
        f[i][j-1]=1;
        g[step] = dig[i][j-1];
        dfs(i,j-1,sum+g[step],step+1);
        g[step]=f[i][j-1]=0;
    }
}
int main(){
    for(int i=0;i<5;i++){
        for(int j = 0;j<5;j++){
            f[i][j] = 1;
            g[0] = dig[i][j];
            dfs(i,j,g[0],1);
            g[0]=f[i][j]=0;
        }
    }
    printf("%d\n",max);
    return 0;
} 
问题分析: 这是一个典型的图论问题,可以用最大权闭合子图或者匈牙利算法来解决。但是这里我们使用增广路算法来解决。 首先,将每个格子看作一个节点,然后将图中的每一行和每一列均分成两个点集合,分别为左点集合和右点集合。如果一个格子在第i行第j列,则将其与第i个左点和第j个右点相连。这样就得到了一个二分图。接下来,将左点集合中的所有点都连接到源点(超级源点),并将右点集合中的所有点都连接到汇点(超级汇点)。然后,我们就可以将这个问题转化为从源点到汇点的最大流问题。 但是,由于我们的图是二分图,因此可以使用Hopcroft-Karp算法或者Dinic算法来求解最大流。这里我们使用Dinic算法来求解最大流。 最后,我们需要找到所有在最大流中的正向边(即流量为1的边),这些边所连接的两个节点所代表的格子中的数字就是我们所要选择的数,其总和就是最大权值。 算法描述: 1. 构建二分图: - 将每个格子看作一个节点; - 将每一行和每一列均分成两个点集合,分别为左点集合和右点集合; - 如果一个格子在第i行第j列,则将其与第i个左点和第j个右点相连。 2. 求解最大流: - 将左点集合中的所有点都连接到源点(超级源点); - 将右点集合中的所有点都连接到汇点(超级汇点); - 使用Dinic算法求解最大流。 3. 找出所有在最大流中的正向边: - 找到所有在最大流中的正向边,这些边所连接的两个节点所代表的格子中的数字就是我们所要选择的数; - 计算所选数的总和,输出结果。 输入样例: 4 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出样例: 57 程序代码如下:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值