DAG优化
来源:互联网 发布:淘宝卖盗版软件违法吗 编辑:程序博客网 时间:2024/06/07 14:49
大家都学过了代码优化,其中有一个DAG优化,这次我们就练习这个操作。
Input
输入第一行为一个整数n(n < 100),表示该组输入的表达式的个数
之后n行为表达式,每个变量为一个字母,表达式仅包括二元运算 + - * /
例如:A=B+C
Output
通过构造DAG图,进行代码优化,只需要保留AB,删除无用变量,删除变量时,尽量保留最早出现的变量。
PS:保证AB的值不同
Example Input
3A=B+CB=B+BA=C+C
Example Output
B=B+BA=C+C
#include <bits/stdc++.h>using namespace std;int n;int cnt;struct Node{ char id; int left = -1, right = -1; vector<char> var;} node[110];bool find_var(int i,char c){ for(char j : node[i].var)if(j == c)return 1; return 0;}int add_node(char c){ for(int i = cnt-1; i >= 0; --i) if(node[i].id == c || find_var(i,c))return i; node[cnt].id = c; return cnt++;}void add_operator(char c,char op,int l,int r){ for(int i = cnt-1; i >= 0; --i) if(node[i].left == l && node[i].right == r && node[i].id == op) { node[i].var.push_back(c); return ; } node[cnt].id = op; node[cnt].var.push_back(c); node[cnt].left = l; node[cnt].right = r; cnt++;}char s[10];char ans[110][10];bool flag[110];void dfs(int x){ if(node[x].left != -1) { flag[x] = 1; dfs(node[x].left); dfs(node[x].right); }}int main(){ cnt = 0; scanf("%d",&n); for(int i = 0; i < n; ++i) { scanf("%s",s); int l = add_node(s[2]); int r = add_node(s[4]); add_operator(s[0],s[3],l,r); } for(int i = 0; i < cnt; ++i) { if(node[i].left != -1) { ans[i][0] = node[i].var[0]; ans[i][1] = '='; Node ll = node[node[i].left],rr = node[node[i].right]; ans[i][2] = ll.var.size() > 0 ? ll.var[0] : ll.id; ans[i][3] = node[i].id; ans[i][4] = rr.var.size() > 0 ? rr.var[0] : rr.id; ans[i][5] = 0; } } for(int i = cnt-1; i >= 0; --i) { if(ans[i][0] == 'A') { dfs(i); break; } } for(int i = cnt-1; i >= 0; --i) { if(ans[i][0] == 'B') { dfs(i); break; } } for(int i = 0; i < cnt; ++i)if(flag[i])puts(ans[i]); return 0;}
阅读全文
0 0
- DAG优化
- DAG优化
- Flink DAG编译和优化
- DAG
- DAG
- 2015.12.8 编译,代码优化,DAG
- DAG模型
- DAG模型
- 什么是DAG
- poj_3018_Giftbox(DAG)
- sicily DAG?
- DAG 问题
- (DAG)NestedRectangle
- Sicily DAG?
- <OJ_Sicily>DAG
- DAG任务
- uva437 DAG
- HDU1069(DAG)
- APK反编译
- 断点续传下载文件 http
- 【第八周】项目一 建立顺序串算法库
- 解决“libstdc++.so.6: version `GLIBCXX_3.4.18' not found”
- [C#] Gembox.SpreadSheet向Excel写入数据及图表
- DAG优化
- 前端项目积累和总结——表单验证
- 集成极光推送总结
- Invalidate()与UpdateWindow()
- 判断子线程是否执行完毕
- redis sentinel配置(windows环境)
- 第七周 项目 4
- LOJ6005 「网络流 24 题
- JDBC与MySQL