例題6-3 Matrix Chain Multiplication ,Uva 442

deepwzh發表於2016-08-07

 

這個題思路沒有任何問題,但還是做了近三個小時,其中2個多小時除錯I don't know smile

得到的經驗有以下幾點:

  1. 一定學會除錯,掌握輸出中間量的技巧,加強gdb除錯的學習
  2. 有時候程式碼不對,得到的結果卻是對的(之後總結以下常見錯誤)
  3. 能用結構體,就別用陣列,容易出錯(暫時還不知道為什麼)=>現在知道申請的陣列空間在執行期間被釋放,除非用malloc去申請陣列
  4. 程式碼要規範,空格該有就要有
  5. 有些不規範表示式,不同編譯器出現不同結果,注意應避免使用這類語句

像這道題主要坑在了第三點上,以後要注意避免

 

以下是AC程式碼

 

 第一次完成時間(大於2小時)

#include <cstdio>
#include <stack>
#include <cstring>
#include <cctype>
const int MAXN=1000+10;
using namespace std;
char exps[MAXN];
struct Matrix {
    int a, b;
    Matrix(int a = 0,int b = 0):a(a), b(b) {}
}m[26];
stack<Matrix> s;
int main(){
    #ifdef DEBUG
    freopen("6.3.in","r",stdin);
    #endif
    int n;
    scanf("%d\r",&n);
    for(int i=0;i<n;i++){
        char s0[10];
        char c;
        scanf("%c ",&c);
        s0[0]=c;
        scanf("%d %d\r\n",&m[s0[0] -'A'].a, &m[s0[0] -'A'].b);
        //printf("%c %d %d\r\n",s0[0] , m[s0[0] -'A'].a , m[s0[0]-'A'].b);
    }
    while(scanf("%s",exps)==1){
        int sum=0;
        int len=strlen(exps);
        int ok=1;
        for(int i=0;i<len;i++){
            if(isalpha(exps[i])){
                s.push(m[exps[i]-'A']);
             //  printf("push %d %d \n",m[exps[i]-'A'].a,m[exps[i]-'A'].b);
            }
            else if(exps[i]==')'){
                Matrix m2 = s.top(); s.pop();
            //    printf("pop %d %d \n", m2.a, m2.b);
                Matrix m1 = s.top(); s.pop();
             //   printf("pop %d %d \n", m1.a, m1.b);
                if(m1.b != m2.a){ok=0;break;}
                sum+= m1.a * m1.b * m2.b;
                s.push(Matrix(m1.a, m2.b));
             //  printf("push %d %d \n",m1.a, m2.b,);
            }
        }
        if(ok)printf("%d\n",sum);
        else printf("error\n");
    }
    return 0;
}

 第二次練習程式碼(完成時間約1小時)

 1 //UVa 442,Matrix Chain Multiplication
 2 //Example:6-3
 3 //Author:wzh
 4 //Date: 2016.8.26
 5 //Version 2
 6 
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <cctype>
10 #include <stack>
11 #include <cstdlib>
12 using namespace std;
13 #define maxn 30
14 int s[maxn][2];
15 char buf[1000];
16 int main(){
17     #ifdef D 
18     freopen("442.in","r",stdin);
19     #endif
20     int n;
21     scanf("%d ",&n);
22     for(int i=0;i<n;i++){
23         char c;int a,b;
24         scanf("%c",&c);
25         scanf("%d%d ",&s[c-'A'][0],&s[c-'A'][1]);
26         //printf("%c %d %d\n",c,s[c-'A'][0],s[c-'A'][1]);
27     }
28     
29     while(fgets(buf,10000,stdin)){
30         int len=strlen(buf);
31         stack<int*> sk;
32         int sum=0;
33         int ok=1;
34         for(int i=0;i<len;i++){
35             if(buf[i]==')'){
36                 int *a,*b,*c;
37                 b=sk.top();sk.pop();
38                 //printf("pop%d %d\n",b[0],b[1]);
39                 a=sk.top();sk.pop();
40                // printf("pop%d %d\n",a[0],a[1]);
41                 if(a[1]==b[0]){
42                     sum+=(a[0]*a[1]*b[1]);
43                     c=(int*)malloc(sizeof(int)*2);
44                     c[0]=a[0];
45                     c[1]=b[1];
46                     sk.push(c);
47                  //   printf("push*%d %d\n",c[0],c[1]);
48                 }
49                 else{
50                     ok=0;
51                     break;
52                 }
53             }
54             else if(isalpha(buf[i])){
55                 sk.push(s[buf[i]-'A']);
56                 //printf("push%d %d\n",s[buf[i]-'A'][0],s[buf[i]-'A'][1]);
57             }
58         }        
59         if(ok)printf("%d\n",sum);
60         else printf("error\n");
61     }
62     return 0;
63 } 

 

相關文章