当前位置: 首页 > article >正文

[Algorithm][综合训练][kotori和n皇后][取金币][矩阵转置]详细讲解

目录

  • 1.kotori和n皇后
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 2.取金币
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 3.矩阵转置
    • 1.题目链接
    • 2.算法原理详解 && 代码实现


1.kotori和n皇后

1.题目链接

  • kotori和n皇后

2.算法原理详解 && 代码实现

  • 解法:哈希表 + 数学思维

    • 重点:使⽤哈希表标记⾏列以及两个对⻆线
      请添加图片描述
    #include <iostream>
    #include <unordered_set>
    using namespace std;
    
    int main()
    {
        int k = 0, t = 0;
        cin >> k;
        
        unordered_set<long long> row;
        unordered_set<long long> col;
        unordered_set<long long> dig1; // 主对角线
        unordered_set<long long> dig2; // 副对角线
        
        int ret = 0x3f3f3f3f; // 防止没有互相攻击的
        for(int i = 0; i < k; i++)
        {
            int x, y;
            cin >> x >> y;
            
            if(ret != 0x3f3f3f3f)
            {
                continue;
            }
            
            if(row.count(y) || col.count(x) || dig1.count(y - x) || dig2.count(y + x))
            {
                ret = i + 1;
            }
            
            row.insert(y);
            col.insert(x);
            dig1.insert(y - x);
            dig2.insert(y + x);
        }
        
        cin >> t;
        while(t--)
        {
            int i = 0;
            cin >> i;
            
            if(i >= ret)
            {
                cout << "Yes" << endl;
            }
            else
            {
                cout << "No" << endl;
            }
        }
        
        return 0;
    }
    

2.取金币

1.题目链接

  • 取金币

2.算法原理详解 && 代码实现

  • 解法:动态规划 -> 区间DP
    • 状态表示dp[i][j]:区间[i, j]的金币全部拿走,能获得的最大积分是多少

    • 状态转移方程
      请添加图片描述

    • 初始化

      • 原始表两边各加一格,填入1
      • DP表多加两行两列,全部初始化为0
        请添加图片描述
    • 填表顺序:从下往上,从左往右

    • 返回值dp[1][n]

    int getCoins(vector<int>& coins) 
    {
        int n = coins.size();
    
        vector<int> arr(n + 2, 0);
        arr[0] = arr[n + 1] = 1;
        for(int i = 1; i <= n; i++)
        {
            arr[i] = coins[i - 1];
        }
    
        vector<vector<int>> dp(n + 2, vector<int>(n + 2, 0));
        for(int i = n; i >= 1; i--)
        {
            for(int j = i; j <= n; j++)
            {
                for(int k = i; k <= j; k++)
                {
                    dp[i][j] = max(dp[i][j], 
    							   dp[i][k - 1] + dp[k + 1][j] + arr[i - 1] * arr[k] * arr[j + 1]);
                }
            }
        }
    
        return dp[1][n];
    }
    

3.矩阵转置

1.题目链接

  • 矩阵转置

2.算法原理详解 && 代码实现

  • 解法:数学 -> 转置前和转置后下标的关系
    请添加图片描述

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        int n = 0, m = 0;
        cin >> n >> m;
    
        vector<vector<int>> nums(n, vector<int>(m, 0));
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
            {
                cin >> nums[i][j];
            }
        }
    
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                // ret[i][j] = arr[j][i]
                cout << nums[j][i] << " ";
            }
            cout << endl;
        }
    
        return 0;
    }
    

http://www.kler.cn/a/288401.html

相关文章:

  • A029-基于Spring Boot的物流管理系统的设计与实现
  • 【C语言】值传递和地址传递
  • 山泽光纤HDMI线:铜线的隐藏力量
  • 力扣104 : 二叉树最大深度
  • 利用阿里云下载 WebRTC 源码
  • [前端]NodeJS常见面试题目
  • 【JavaEE初阶】HTTP请求(Request)
  • 某付宝又火了!什么样的人能够申请网商贷?个人也能申请吗?
  • Java基于微信小程序的超市购物管理系统
  • golang中return和defer的执行顺序的一道题
  • 华为与联发科的专利博弈:技术较量还是市场重塑?
  • 【区块链 + 物联网】斐得坊智慧停车区块链 | FISCO BCOS应用案例
  • 【教程】2024.09.03 Qlib数据加载器以及数据集加载器 Alpha158 Aplha360详细的讲解,以及源码
  • JAVAEE初阶第二节——多线程基础(上)
  • golang关于slice map函数传参的小问题
  • 娱乐小项目-树莓派履带小车
  • 中兴-ZSRV2路由器-任意文件读取
  • arcgisjs4.0 内网部署字体不显示问题处理
  • 【技术详解】Java泛型:全面解析与实战应用(进阶版)
  • sqli-labs靶场通关攻略(六十一关到六十五关)
  • ARM/Linux嵌入式面经(三十):腾讯 C++开发工程师
  • 【Linux学习】Linux开发工具——vim
  • html+css+js网页设计 博物馆 亚历山大美术馆6个页面
  • Flask中的g的作用
  • Linux学习笔记(4)----Debian压力测试方法
  • 日本IT编程语言对比分析-Python /Ruby /C++ /Java