列舉(矩陣消除、七段數碼管)
目錄
矩陣消除:
題目:
牛妹在玩一個名為矩陣消除的遊戲,矩陣的大小是行列,第行第列的單元格的權值為,
牛妹可以進行個回合的遊戲,在每個回合,牛妹可以選擇一行或者選擇一列,
然後將這一行或者這一列的所有單元格中的權值變為,同時牛妹的分數會加上這一行或者這一列中的所有單元格的權值的和。
牛妹想最大化她的得分,球球你幫幫她吧!
輸入描述:
第一行三個整數
接下來行每行個整數表示矩陣中各個單元格的權值。
輸出描述:
輸出一個整數表示牛妹能獲得的最大分數。
1<=n,m<=15 1<=k<=n*m;
思路:
剛開始想著記錄每行每列的數,排序,選擇,重排。顯然,會造成相等情況下不同選擇會有不同的結果。這個思路可以pass掉了。
資料範圍較小的時候,用二進位制列舉:利用二進位制列舉每一種狀態。比如010101,就是選擇1 3 5不選擇2 4 6。在這裡列舉那幾行,然後重新排列再選擇最高的幾列(選擇列的時候不會改變其它列的和)。
列舉行數比k大或者列舉的行數+所有列數都達不到k,就沒有必要再算下去,直接continue;
K的值是≤n*m,需要縮小k的範圍,賦值k,n,m的最小的那一樣數(如果n,m小,k直接全部選擇即可)
程式碼:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<map>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = 1e6+50;
ll _map[20][20];
int main(){
int n,m,k;
cin >> n >> m >> k;
ll ans = 0,sum_x[20]={0};
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++)
cin >> _map[i][j],sum_x[i]+=_map[i][j];
}
k=min(k,n);k=min(k,m);
int sta = (1<<n);
for(int i = 0;i < sta;i++){
ll sum_y[20] = {0},maxs = 0,cnt_c=0;
for(int j = 1;j <= m;j++)
for(int k = 1;k <= n;k++)
sum_y[j]+=_map[k][j];
for(int j = 0;j < n;j++){
if(((i>>j)&1)){
cnt_c++;
maxs += sum_x[j+1];
for(int k = 1;k <= m;k++)
sum_y[k]-=_map[j+1][k];
}
}
if(cnt_c+m < k||cnt_c > k) continue;/*k<=n*m 過大的話可能導致cnt_c+m<k退出,極限等於min(m,n,k)即可*
sort(sum_y+1,sum_y+m+1);
if(cnt_c < k)
for(int j = m;j >= 1;j--){
maxs+=sum_y[j];
if(cnt_c+(m-j+1) == k) break;//錯誤 需要判斷不需要列的情況
}
ans = max(ans,maxs);
}
cout << ans << endl;
}
七段數碼管(藍橋杯題目)
大致題意:
七條邊,不能全滅,有的亮有的滅或者全亮。所有亮的並且連通的種類數。
思路:
並查集+dfs,我感覺比較複雜,不如列舉每一種情況(畢竟只有7個管),然後判斷是否
連通(可以利用Flody,離散中的沃舍爾演算法)。
程式碼:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<cstdio>
#include<cmath>
#include<stdlib.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e6+50;
int dis[10][10];
int a[10];
int tot;
void ini(){
dis[1][1] = 0;
dis[1][2] = 1; dis[2][2]=0;
dis[1][3] = INF;dis[2][3]=1; dis[3][3]=0;
dis[1][4] = INF;dis[2][4]=INF;dis[3][4]=1; dis[4][4]=0;
dis[1][5] = INF;dis[2][5]=INF;dis[3][5]=INF;dis[4][5]=1; dis[5][5]=0;
dis[1][6] = 1; dis[2][6]=INF;dis[3][6]=INF;dis[4][6]=INF;dis[5][6]=1;dis[6][6]=0;
dis[1][7] = INF;dis[2][7]=1; dis[3][7]=1; dis[4][7]=INF;dis[5][7]=1;dis[6][7]=1;dis[7][7]=0;
for(int i = 1;i <= 7;i++)
for(int j = i;j <= 7;j++)
dis[j][i] = dis[i][j];
}
void Floyd(){
for(int k = 0;k < tot;k++)
for(int i = 0;i < tot;i++)
for(int j = 0;j < tot;j++)
if(dis[a[i]][a[j]] > dis[a[i]][a[k]]+dis[a[k]][a[j]])
dis[a[i]][a[j]] = dis[a[i]][a[k]]+dis[a[k]][a[j]];
}
bool check(int sta){
int cnt = 1;tot = 0;
while(sta){
if(sta&1==1) a[tot++]=cnt;
sta>>=1;
cnt++;
}
Floyd();
for(int i = 0;i < tot;i++)
for(int j = 0;j < tot;j++)
if(dis[a[i]][a[j]] == INF) return false;
return true;
}
int main(){
int sta = 1<<7,cnt=0;
for(int i = 1;i < sta;i++){
ini();
if(check(i)) cnt++;
}
cout<<cnt<<endl;
return 0;
}
相關文章
- 七段數碼管繪製
- 高斯消除矩陣矩陣
- 矩陣消除遊戲矩陣遊戲
- 靜態數碼管顯示、動態數碼管顯示、矩陣按鍵矩陣
- 矩陣和陣列矩陣陣列
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- 資料結構之陣列和矩陣--矩陣&不規則二維陣列資料結構陣列矩陣
- 【程式碼隨想錄】一、陣列:5.螺旋矩陣陣列矩陣
- 資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘資料結構陣列矩陣
- 演算法-陣列與矩陣演算法陣列矩陣
- python輸入詳解(陣列、矩陣)Python陣列矩陣
- 七段碼
- js陣列方法(管飽)JS陣列
- 線性代數--矩陣矩陣
- 高等代數1 矩陣矩陣
- 6.5陣列--模擬、偏移量-螺旋矩陣陣列矩陣
- c語言中實現4行3列矩陣和3行4列矩陣的運算C語言矩陣
- 第四章:多維陣列和矩陣 ------------- 4.8 子矩陣的最大累加和陣列矩陣
- leetcode:面試題 01.08. 零矩陣(陣列,中等)LeetCode面試題矩陣陣列
- 矩陣指數的定義矩陣
- 巨大的矩陣(矩陣加速)矩陣
- 鄰接矩陣、度矩陣矩陣
- 第四章:多維陣列和矩陣 ------------- 4.7 子陣列最大累加和陣列矩陣
- 奇異矩陣,非奇異矩陣,偽逆矩陣矩陣
- C語言:將一個4X4的矩陣賦值,矩陣元素的值為其行數與列數的乘積C語言矩陣賦值
- POJ 3233 Matrix Power Series (矩陣快速冪+等比數列二分求和)矩陣
- 幸運數(dp+矩陣加速)矩陣
- 巨大的數(dp+矩陣加速)矩陣
- 數碼管
- 矩陣矩陣
- 求任意矩陣的伴隨矩陣矩陣
- HDU 4549 M斐波那契數列(矩陣快速冪+費馬小定理)矩陣
- 從LLM中完全消除矩陣乘法,效果出奇得好,10億引數跑在FPGA上接近大腦功耗矩陣FPGA
- 977.有序陣列的平方 ,209.長度最小的子陣列 ,59.螺旋矩陣II陣列矩陣
- C++ 練氣期之二維陣列與矩陣運算C++陣列矩陣
- matlab計算含有未知數的矩陣Matlab矩陣
- 人工智慧數學基礎—-矩陣人工智慧矩陣
- 人工智慧數學基礎----矩陣人工智慧矩陣