light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)

举报
xindoo 发表于 2022/04/16 00:51:46 2022/04/16
【摘要】 题目链接      大概题意是有n个男的n个女的(原谅我这么说,我是粗人),给你一个n*n的矩阵,第i行第j列表示第i个女(男)对第j个男(女)的好感度,然后要安排n对相亲,保证都是正常的(无搞基百合之类的),然后求怎么安排能使好感度和最大,求出最大值。     开始试了纯暴力...

题目链接

     大概题意是有n个男的n个女的(原谅我这么说,我是粗人),给你一个n*n的矩阵,第i行第j列表示第i个女(男)对第j个男(女)的好感度,然后要安排n对相亲,保证都是正常的(无搞基百合之类的),然后求怎么安排能使好感度和最大,求出最大值。


    开始试了纯暴力的方法,时间复杂度是n!果断超时


  
  1. #include <iostream>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. int vis[17];
  6. int n, ans, sum;
  7. int map[19][19];
  8. void dfs(int x)
  9. {
  10. if (x == n+1)
  11. {
  12. ans = max(ans, sum);
  13. return;
  14. }
  15. for (int i = 1; i <= n; i++)
  16. {
  17. if (vis[i] == 0)
  18. {
  19. sum += map[x][i];
  20. vis[i] = 1;
  21. dfs(x+1);
  22. vis[i] = 0;
  23. sum -= map[x][i];
  24. }
  25. }
  26. }
  27. int main()
  28. {
  29. int t;
  30. cin >> t;
  31. for (int kase = 1; kase <= t; kase++)
  32. {
  33. cin >> n;
  34. for (int i = 1; i <= n; i++)
  35. for (int j = 1; j <= n; j++)
  36. cin >> map[i][j];
  37. sum = 0;
  38. ans = 0;
  39. memset(vis, 0, sizeof(vis));
  40. dfs(1);
  41. cout << "Case " << kase << ": " << ans << endl;
  42. }
  43. return 0;
  44. }


  
  1. //2013-06-25-22.05
  2. #include <iostream>
  3. #include <string.h>
  4. #include <algorithm>
  5. #include <stdio.h>
  6. using namespace std;
  7. const int maxn = 1<<16;
  8. int vis[17];
  9. int n, ans, sum;
  10. int map[19][19];
  11. int dp[maxn];
  12. int dfs(int x, int d)
  13. {
  14. if (x == 0)
  15. return 0;
  16. if (dp[x])
  17. return dp[x];
  18. for (int i = 0; i < n; i++)
  19. {
  20. if (x&(1<<i))
  21. dp[x] = max(dfs(x^(1<<i), d-1)+map[i+1][d], dp[x]);
  22. }
  23. return dp[x];
  24. }
  25. int main()
  26. {
  27. int t;
  28. cin >> t;
  29. for (int kase = 1; kase <= t; kase++)
  30. {
  31. cin >> n;
  32. for (int i = 1; i <= n; i++)
  33. for (int j = 1; j <= n; j++)
  34. cin >> map[i][j];
  35. memset(dp, 0, sizeof(dp));
  36. ans = dfs((1<<n)-1, n);
  37. printf("Case %d: %d\n", kase, ans);
  38. }
  39. return 0;
  40. }



文章来源: xindoo.blog.csdn.net,作者:xindoo,版权归原作者所有,如需转载,请联系作者。

原文链接:xindoo.blog.csdn.net/article/details/9173949

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。