n阶行列式 公式计算 (CSDN,我回来啦)

1 篇文章 0 订阅
1 篇文章 0 订阅

n阶行列式 公式计算 (CSDN,我回来啦)

Hi 各位,好久不见
经过两年的间隔,终于又回到了CSDN的大家庭
从一名Oier 转(退)型(化)为一名程序员
离开了两年的代码,可以说水平已经大不如前(QwQ)。所以就从这篇文章开始,回到最初的oier,从头开始练习。同时我也会经常做一些实用的代码,实现一些数学公式等等OvO;

话不多说 ,n阶行列式
公式:在这里插入图片描述

学过高(中)数(学)的小伙伴,会发现这个公式 描述了2个部分:计算逆序对并控制正负号,作积求和;
值得注意的是,将i 固定为 1234… 则j1 j2 j3…以n的全排列形式分布,而正负号 有这些全排列的逆序对的奇偶性决定。(高数讲过,不细说)
这就很方便的看到,只需要获得 1-n 的全排列,求解逆序对数,和计算
目标清楚√
逆序对:
核心:统计到当前数字 i 时,大于i的数字数目和;O(N^2)
(只有 i 前 且 大于 i 的数 与 i 构成逆序)
全排列:
核心;dfs
在这里插入图片描述
(简单的dfs 图示)
最后完成计算部分 就完成啦
#include<bits/stdc++.h>
using namespace std;
#define M 1000
int num[M][M],allsort[M][M],pd[M],temp[M],len,p=1;
int nxd(int sub,int n){
int sum=0;
for(int i=0;i<=n;i++){
int sum1=0;
for(int j=0;j<=i;j++){
if(allsort[sub][j]>allsort[sub][i])sum1++;
}
sum=sum1+sum;
}return sum;
}
void getin(){
for(int i=1;i<=len;i++){
allsort[p][i]=temp[i];
}p++;
}
int allsortdfs(int l,int depth){
if(depth== l){//搜索到最深层
getin();return 1;//把得到的路径保存 并 退出
}
for(int i=1;i<=l;i++){//从 1 2 3 … 开始搜索
if(!pd[i]){// 没用过
pd[i]=1;//变成用过的
temp[depth+1]=i;// 记下来,这里可以理解depth 为 temp 的下标 , temp 为临时的 队列
allsortdfs(l,depth+1);// 向下搜索一层
pd[i]=0;//回溯的时候 消除标记
}
}
}
int calculate(){
int ans=1,sum=0;
for(int i=1;i<p;i++){
ans=1;
for(int j=1;j<=len;j++){
ans=num[j][allsort[i][j]]ans;
}
ans=ans
allsort[i][len+1];
sum=sum+ans;
}
return sum;
}
int main(){
printf(“请输入阶数:”);scanf("%d",&len);printf(“请输入整数字\n”);
for(int i=1;i<=len;i++){
for(int j=1;j<=len;j++){
scanf("%d",&num[i][j]);
}
}
allsortdfs(len,0);
for(int i=1;i<=p;i++){
int w=nxd(i,len);
if(w%2==1){
allsort[i][len+1]=-1;
}else allsort[i][len+1]=1;
}
printf("answer= %d ",calculate());
} // n 阶行列式公式计算 by andy.x from HNU

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值