关闭

算法提高 金陵十三钗

标签: 蓝桥杯Java回溯算法
554人阅读 评论(2) 收藏 举报
分类:

金陵十三钗
  本题难度:难
  本题占分比例:5%
问题描述
  在电影《金陵十三钗》中有十二个秦淮河的女人要自我牺牲代替十二个女学生去赴日本人的死亡宴会。为了不让日本人发现,自然需要一番乔装打扮。但由于天生材质的原因,每个人和每个人之间的相似度是不同的。由于我们这是编程题,因此情况就变成了金陵n钗。给出n个女人和n个学生的相似度矩阵,求她们之间的匹配所能获得的最大相似度。
  所谓相似度矩阵是一个n*n的二维数组like[i][j]。其中i,j分别为女人的编号和学生的编号,皆从0到n-1编号。like[i][j]是一个0到100的整数值,表示第i个女人和第j个学生的相似度,值越大相似度越大,比如0表示完全不相似,100表示百分之百一样。每个女人都需要找一个自己代替的女学生。
  最终要使两边一一配对,形成一个匹配。请编程找到一种匹配方案,使各对女人和女学生之间的相似度之和最大。
输入格式
  第一行一个正整数n表示有n个秦淮河女人和n个女学生
  接下来n行给出相似度,每行n个0到100的整数,依次对应二维矩阵的n行n列。
输出格式
  仅一行,一个整数,表示可获得的最大相似度。
样例输入
4
97 91 68 14
8 33 27 92
36 32 98 53
73 7 17 82
样例输出
354
数据规模和约定
  对于70%的数据,n<=10
  对于100%的数据,n<=13
样例说明
  最大相似度为91+92+93+73=354
  


代码:

import java.util.Scanner;

/*
 * 8皇后的变种
 */
public class Main {
    static int N;
    static int[][] num;
    static int[] b;
    static int sum = 0;

    public static void dfs(int t){
        if ( t == N){
            int sum1 = 0;
            for ( int i = 0 ; i < N ; i++){
                sum1 += num[i][b[i]];
            }
            sum = Math.max(sum, sum1);
            return;
        }else{
            //第cur个人替代第i个人  
            for ( int i = 0 ; i < N ; i++){
                boolean flag = true;
                int j;
                for ( j = 0 ; j < t ; j++){
                    //第i个人已经被替代了
                    if( b[j] == i){
                        flag = false;
                        break;
                    }
                }
                if ( flag == true){
                    b[j] = i;
                    dfs(t+1);
                }
            }
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        N = in.nextInt();
        num = new int[N][N];
        b = new int[N];
        for ( int i = 0 ; i < N ; i++){
            for (int j = 0 ; j < N ; j++){
                num[i][j] = in.nextInt();
            }
        }
        dfs(0);
        System.out.println(sum);

        in.close();
    }

}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

蓝桥杯算法提高 -- 金陵十三钗

思路 :  这道题最基本的做法就是DFS直接暴力破解, 这样的复杂度毫无疑问的O( n! ), 是不能完全AC的. 那么, 看到这道题问的是最优解, 那么想必跟动态规划能扯上关系了, 但是咋一看, ...
  • Lonverce
  • Lonverce
  • 2015-12-03 19:08
  • 1473

蓝桥杯 算法提高 金陵十三钗

算法提高 金陵十三钗   时间限制:1.0s   内存限制:256.0MB        金陵十三钗   本题难度:难   本题占分比例:5% 问题描述   ...
  • qq_25605637
  • qq_25605637
  • 2017-02-11 16:49
  • 438

蓝桥杯 算法提高 金陵十三钗

金陵十三钗   本题难度:难   本题占分比例:5% 问题描述   在电影《金陵十三钗》中有十二个秦淮河的女人要自我牺牲代替十二个女学生去赴日本人的死亡宴会。为了不让日本人发现,自然需要一番乔...
  • zengjingchao
  • zengjingchao
  • 2017-12-18 21:42
  • 36

算法提高 金陵十三钗 状压DP

思路:深度搜索复杂度N!过不了。考虑动态规划:将已经选择的列记为1,未选择表示0,二进制压缩,例如110,就表示选择了第0列和第1列。      d(i, t)表示当前已经匹配了i行,选择了t这些列...
  • flyawayl
  • flyawayl
  • 2017-03-06 17:14
  • 244

算法提高 金陵十三钗 状态亚索DP

问题描述   在电影《金陵十三钗》中有十二个秦淮河的女人要自我牺牲代替十二个女学生去赴日本人的死亡宴会。为了不让日本人发现,自然需要一番乔装打扮。但由于天生材质的原因,每个人和每个人之间的相似度...
  • Little_boy_z
  • Little_boy_z
  • 2017-12-02 19:48
  • 44

蓝桥杯_算法提高_金陵十三钗(简单枚举)

金陵十三钗   本题难度:难   本题占分比例:5% 问题描述   在电影《金陵十三钗》中有十二个秦淮河的女人要自我牺牲代替十二个女学生去赴日本人的死亡宴会。为了不让日本人发现,自然需要一番乔...
  • huangxiang360729
  • huangxiang360729
  • 2016-03-31 12:20
  • 692

蓝桥杯 金陵十三钗

金陵十三钗   本题难度:难   本题占分比例:5% 问题描述   在电影《金陵十三钗》中有十二个秦淮河的女人要自我牺牲代替十二个女学生去赴日本人的死亡宴会。为了不让日本人发现,自然需要一番乔...
  • qq_33245342
  • qq_33245342
  • 2017-02-24 23:40
  • 168

蓝桥杯_算法提高_金陵十三钗(动态规划)

金陵十三钗   本题难度:难   本题占分比例:5% 问题描述   在电影《金陵十三钗》中有十二个秦淮河的女人要自我牺牲代替十二个女学生去赴日本人的死亡宴会。为了不让日本人发现,自然需要一番乔...
  • huangxiang360729
  • huangxiang360729
  • 2016-03-31 17:28
  • 1100

【玩转数据系列十三】机器学习算法基于信用卡消费记录做信用评分

如果你是做互联网金融的,那么一定听说过评分卡。评分卡是信用风险评估领域常用的建模方法,评分卡并不简单对应于某一种机器学习算法,而是一种通用的建模框架,将原始数据通过分箱后进行特征工程变换,继而应用于线...
  • Gamay
  • Gamay
  • 2017-06-14 14:35
  • 1079

算法提高 P1001

必须感叹下,大数模板就是好用!     AC代码: #include #include #include #include #include #include #include #i...
  • flyawayl
  • flyawayl
  • 2017-02-22 21:14
  • 183
    个人资料
    • 访问:138595次
    • 积分:4744
    • 等级:
    • 排名:第7079名
    • 原创:327篇
    • 转载:0篇
    • 译文:0篇
    • 评论:80条
    博客专栏
    最新评论