开始学线性代数啦, 当然作为学软件的,学数学就是要用数学的。 再说还有这么的作业要写,写个小程序岂不是很省力。
说明: 输入行列式的 行(列)数 N
并依次输入n*n个数。 程序将输出
行列式的计算算式,并得出结果!
代码实现分析: 调用头文件<algorithm>里的库函数 next_permutation() 具体实现细节详见代码。
用线段树求逆序数时间复杂度为N*logN。 当然以这种时间复杂度的算法还有树状数组求逆序数, 归并排序求逆序数。
当然你也可以用直接暴力的方法求出逆序数,代码是十分简单的。时间复杂度和插入排序相同n*n。
然后就是具体的一些实现细节啦!
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; void PushUp(int cur, int *sum) { sum[cur] = sum[cur<<1]+sum[cur<<1|1]; } void Build(int l, int r, int cur, int *sum) { sum[cur] = 0; if(l==r) return ; int m = (l+r)>>1; Build(l, m, cur<<1, sum); Build(m+1, r, cur<<1|1, sum); } void Update(int p, int l, int r, int cur, int *sum) { if(l==r) { sum[cur]++; return; } int m = (l+r)>>1; if(p<=m) Update(p, l, m, cur<<1, sum); else Update(p, m+1, r, cur<<1|1, sum); PushUp(cur, sum); } int Query(int L, int R, int l, int r, int cur, int *sum) { if(L<=l&&r<=R) { return sum[cur]; } int m = (l+r)>>1; int ret = 0; if(L<=m) ret+=Query(L, R, l, m, cur<<1, sum); if(R>m) ret+=Query(L, R, m+1, r, cur<<1|1, sum); return ret; } int Reverse(int n, int *p) { int sum[n<<2]; Build(0, n-1, 1, sum); int tot = 0; for(int i=0; i<n; i++) { tot+=Query(p[i], n-1, 0, n-1, 1, sum); Update(p[i], 0, n-1, 1, sum); } return tot; } void solve(int n, int a[15][15]) { int flag = 0; long long ans=0; int p[15]; for(int i=0; i<n; i++) p[i] = i+1; do { int ok = Reverse(n, p); if(ok&1) { flag++; printf(" - "); long long temp=1; for(int j=1, i=0; i<n; j++, i++) { temp*=(long long)a[j][p[i]]; if(j!=1)printf(" * "); printf("%d", a[j][p[i]]); } ans-=temp; } else { if(flag)printf(" + "); flag++; long long temp=1; for(int j=1, i=0; i<n; j++, i++) { temp*=(long long)a[j][p[i]]; if(j!=1)printf(" * "); printf("%d", a[j][p[i]]); } ans+=temp; } }while(next_permutation(p, p+n)); printf("\n%d\n\n", ans); } int main() { int n; int a[15][15]; while(scanf("%d", &n)!=EOF) { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%d", &a[i][j]); solve(n, a); } return 0; }
PS: 上述程序求解的整型的行列式, (因为课本里的行列式都是整型的,小恪偷了个懒!), 对于其他类型的, 可以定义一个模板! 或者直接把整型的改成实数型。
时间: 2024-10-28 23:31:56