DAG最適化-詳細
17295 ワード
DAG最適化
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
コード最適化を学んだことがありますが、その中にDAG最適化があります.今回はこの操作を練習します.
Input
第1の動作の整数n(n<100)を入力し、そのグループが入力した式の個数を表す
その後n動作式、各変数は1文字で、式は2元演算+-*/のみを含む
例えば、A=B+C
Output
DAG図を構築することで,コード最適化を行い,ABを保持し,不要な変数を削除し,変数を削除する際には,最も早く出現した変数をできるだけ保持する.
PS:ABの値が異なることを保証する
Sample Input
3 A=B+C B=B+B A=C+C
Sample Output
B=B+B A=C+C私はネット上で多くのコードACという問題を見て、すべて90行近くで、しかも注釈がなくて、とても理解しにくいように見えて、長い間探してやっと1つの異なる他の書き方のブロガーのブログを発見して、しかも40行余りしかなくて、しかし注釈もなくて、私は1時間以上かけて理解して、それからみんなに注釈をつけました
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
コード最適化を学んだことがありますが、その中にDAG最適化があります.今回はこの操作を練習します.
Input
第1の動作の整数n(n<100)を入力し、そのグループが入力した式の個数を表す
その後n動作式、各変数は1文字で、式は2元演算+-*/のみを含む
例えば、A=B+C
Output
DAG図を構築することで,コード最適化を行い,ABを保持し,不要な変数を削除し,変数を削除する際には,最も早く出現した変数をできるだけ保持する.
PS:ABの値が異なることを保証する
Sample Input
3 A=B+C B=B+B A=C+C
Sample Output
B=B+B A=C+C私はネット上で多くのコードACという問題を見て、すべて90行近くで、しかも注釈がなくて、とても理解しにくいように見えて、長い間探してやっと1つの異なる他の書き方のブロガーのブログを発見して、しかも40行余りしかなくて、しかし注釈もなくて、私は1時間以上かけて理解して、それからみんなに注釈をつけました
#include
// , A,B , A,B ,
// A=C+D, C=*** D=*** ,
using namespace std;
int print[100];// , 0 1, 1
char formula[100][20];// String formula[];
int revelant[300];// A,B A,B ACCII , 1, revelant['A']=1, revelant[65]=1;
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
scanf("%s",formula[i]);// forMula
memset(revelant,0,sizeof(revelant));
memset(print,0,sizeof(print));
revelant['A']=revelant['B']=1;// revelant[65]=1,revelant[66]=1,
for(int i=n; i>=1; i--)// A,B ,
{// A,B , formula[i] A,B , print[i]=1
if(revelant[(int)formula[i][0]]==1)
{
print[i]=1;
revelant[(int)formula[i][0]]=0;// , A=B+C,A=D+F,
revelant[(int)formula[i][2]]=1;
revelant[(int)formula[i][4]]=1;
}
}
for(int i=1; i<=n; i++)
{
if(print[i]==1)
{
if(formula[i][0]=='A'||formula[i][0]=='B')// A/B=D+C, A,B, , A=***,
continue;//
for(int j=1; j<=i-1; j++)
{
if(formula[i][2]==formula[j][2]&&formula[i][3]==formula[j][3]&&formula[i][4]==formula[j][4])// A=C+D,C=G+F ,i *=G+F , , 。 break
{
print[j]=1;// , , 1,
print[i]=0;
for(int k=i+1; k<=n; k++)// i C=G+F, j *=G+F
{// i , C *, i+3 D=C+B, D=*+B
if(formula[k][0]==formula[i][0])break;
if(formula[k][2]==formula[i][0]) formula[k][2]=formula[j][0];
if(formula[k][4]==formula[i][0]) formula[k][4]=formula[j][0];
}
break;
}
}
}
}
for(int i=1;i<=n;i++)
{// 1
if(print[i]==1)
printf("%s
",formula[i]);
}
}