藍橋杯 演算法提高 矩陣乘法
阿新 • • 發佈:2019-01-11
此題只過了7個測試點,後面的速度可以(本地執行感覺挺快的,提交測試是超時),但是結果是負數,應該是乘的結果超出了邊界,但不知怎麼修改
一開始沒有理解題意,一直覺得算不出這個答案來,後來發現,題意是這樣的;
舉個例子: 1x10 10x5的矩陣,合併就成了1x5的矩陣,運算次數是1x10x5
每次相鄰的兩個矩陣可以合併,那麼我們總是希望對有兩個最小花費的矩陣進行合併,假設第一個矩陣是x*y,第二個是y*z
那麼新花費就是 第一個矩陣的花費+第二個矩陣的花費+x*y*z;
假設n個矩陣要合併,兩兩子最小花費的矩陣進行合併,種類有n-1種,因此每一種都要判斷
#include<iostream> using namespace std; const int N=1000+9; typedef long long LL; const LL INF=9999999999; LL cost[N][N];//用於儲存i---j兩點的最小花費 LL d[N];//儲存輸入的資料 int main() { LL dp(int start,int end); int n; LL x; cin>>n; for(int i=0;i<n;i++) { cin>>d[i]; if(i>0)d[i]+=d[i-1];//0~i石子之和,方便計算兩堆石子之和 } for(int i=0;i<n;i++) for(int j=0;j<n;j++) cost[i][j]=INF; cout<<dp(0,n-1); return 0; } LL dp(int start,int end) { if(end-start==0) return 0; if(cost[start][end]<INF)return cost[start][end]; else for(int i=start;i<end;i++)//狀態轉移 兩堆最小的花費加上合併兩堆的花費 cost[start][end]=min(cost[start][end],dp(start,i)+dp(i+1,end)); if(start==0)return cost[start][end]+=d[end];//開頭是0,則需要特殊處理 return cost[start][end]+=d[end]-d[start-1];//已經算的要記錄下來,下次使用 }