蓝桥杯_算法提高_金陵十三钗(动态规划)
来源:互联网 发布:杭州雅思考试 知乎 编辑:程序博客网 时间:2024/05/02 04:21
金陵十三钗
本题难度:难
本题占分比例: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+98+73=354
import java.util.Scanner;public class Main { private static int n; private static int[][] mat; private static int[] dp; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); n=sc.nextInt(); mat=new int[n][n]; dp=new int[(int)Math.pow(2,n)]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ mat[i][j]=sc.nextInt(); } } dp[0]=0; for(int i=1;i<=n;i++){ fun(i); } System.out.println(dp[dp.length-1]); } private static void fun(int oneNum){ for(int k=0;k<dp.length;k++){ if(numOfOne(k)==oneNum){ int remain=k;//remain代表k用0替换1后的值 for(int i=0;i<oneNum;i++){ int lastOneNum=lastOneNum(remain);//remain化为二进制整数后最后一个1后的整数值 dp[k]=Math.max(dp[k],dp[k-lastOneNum]+mat[oneNum-1][lastOneIndex(remain)]); remain-=lastOneNum; } } } } //求一个十进制整数化为二进制整数后最后一个1后的整数值 private static int lastOneNum(int num){ int p=1; while(num>=p){ if((num&p)!=0){ return p; } p=(p<<1); } return p; } //求一个十进制整数化为二进制整数后最后一个1出现的位置 private static int lastOneIndex(int num){ int p=1; int position=-1; while(num>=p){ position++; if((num&p)!=0){ return position; } p=(p<<1); } return position; } //求一个十进制整数化为二进制整数后1的个数 private static int numOfOne(int num){ int p=1; int oneNum=0; while(num>=p){ if((num&p)!=0){ oneNum++; } p=(p<<1); } return oneNum; }}
0 0
- 蓝桥杯_算法提高_金陵十三钗(动态规划)
- 蓝桥杯_算法提高_金陵十三钗(简单枚举)
- 蓝桥杯算法提高 -- 金陵十三钗
- 蓝桥杯 算法提高 金陵十三钗
- 蓝桥杯 算法提高 金陵十三钗
- 算法提高 金陵十三钗
- 蓝桥杯_算法提高_概率计算(动态规划)
- 蓝桥杯_算法提高_01背包(动态规划算法)
- 蓝桥杯_算法提高_金属采集(树形动态规划)
- 算法提高 金陵十三钗 状压DP
- 蓝桥杯_算法提高_金明的预算方案(动态规划、01背包变形)
- 算法提高 金陵十三钗 状态亚索DP
- 蓝桥杯 金陵十三钗
- 算法_动态规划_货币兑换
- 算法_动态规划_图像压缩
- 算法_动态规划_电路布线
- 算法_动态规划_流水作业调度
- 算法_动态规划_漂亮打印
- vb
- 微信开发中的编码问题
- 协议和代理
- iOS ARC与MRC混编的一些解决方法
- Android双进程守护
- 蓝桥杯_算法提高_金陵十三钗(动态规划)
- 作业作业 刚才忘加Option Base 1了
- iOS给UILabel设置缩进、行距、字体颜色
- unix域socket绑定路径不创建文件问题[c语言]
- Android中横竖屏切换时,onConfigurationChanged方法不被调用
- 二维码的使用(java版)
- java中GZIPOutputStream 流的使用(EOFException)
- ColorMatrix的使用
- 整体二分 hdu5412 CRB and Queries