ZJU-1094
2010-12-03 19:31
197 查看
典型DP问题矩阵连乘顺序的逆问题。
给出矩阵尺寸和连乘的表达式,求用乘法的次数。
从前往后不停的二合一,括号内可以视为一个矩阵,递归求解。
这道题的AC率好高,可能也有测试数据的功劳
给出矩阵尺寸和连乘的表达式,求用乘法的次数。
从前往后不停的二合一,括号内可以视为一个矩阵,递归求解。
这道题的AC率好高,可能也有测试数据的功劳
//2008-01-12 16:35:10 Accepted 1094 C++ 00:00.00 432K #include<stdio.h> #include<string.h> struct matrix { int a,b; }; char exp[100]; int pe;//处理表达式的当前指针 int len;//表达式长度 int mt;//已乘次数 bool iserr;//错误标志,1表示有错,0表示没错 matrix inmat[27]; matrix getsub() { matrix ta,tb; if(exp[pe]=='(') { pe++; ta = getsub(); } else { ta = inmat[exp[pe]-65]; pe++; } while(pe<len && exp[pe]!=')') { if(exp[pe]=='(') { pe++; tb = getsub(); } else { tb = inmat[exp[pe]-65]; pe++; } if(ta.b==tb.a) { mt += ta.a*ta.b*tb.b; ta.b = tb.b; } else { iserr=true; return ta; } } if(exp[pe]==')') pe++; return ta; } int solve(char exp[100]) { len = strlen(exp); if(len==1) return 0; else { pe=0; mt=0; iserr=false; getsub(); if(iserr) return -1; else return mt; } } int main() { freopen("1094.txt","r",stdin); int n,k,t; char str; scanf("%d",&n); for(k=0;k<n;k++) { scanf("/n%c",&str); scanf(" %d %d",&inmat[str-65].a,&inmat[str-65].b); } //第一部分输入结束 while(scanf("%s",exp)!=EOF) { t = solve(exp); if(t>=0) printf("%d/n",t); else printf("error/n"); } fclose(stdin); return 0; }
相关文章推荐
- ZJU 1952 Heavy Cargo
- ZJU 1115 解题报告
- zju1081 判断点是否在简单多边型内(包括凹的情况)
- ZJU2027 Travelling Fee - 最短路径
- zju 2529 DomiNo Grid
- Zju 2741 Offside解题分析
- ZJU_3048 Continuous Same Game
- ZJU 1004 Anagrams by Stack
- ZJU 3357 Present for MM 【活用背包算法】
- (ZJU-2007复试)-HDOJ-1859-最小长方形
- ZJU 09 复试上机 第三题
- zju 2870
- Jug 倒水问题 ZJU ACM
- zju2830剑术冠军Champion of the Swordsmanship
- ZJU-1066
- zju1049题解
- Zju -- 2859 Matrix Searching(线段树)
- poj 1094 Sorting It All Out
- zju 1499 Increasing Sequences(分步动态规划)
- zju/zoj 1136 Multiple(BFS)