poj 3295 Tautology(经典构造算法题)
思路:1)使用递归模拟,用备忘录优化,否则超时
另外:学到了一个不用递归即可枚举构造0-1序列的方法
for(i=0;i<32;i++) for(j=0;j<5;j++) arr[j]=(i>>j)%2;
【源程序】:
#include "stdio.h" #include "string.h" int arr[101],flag,note[101][101]; int IsCorrect(char *s,int start,int end) { if(note[start][end]!=-1) return note[start][end]; int i; if(end==start) { if(s[start]<='t'&&s[start]>='p') { note[start][end]=arr[s[start]-'p']; return note[start][end]; } else { note[start][end]=2; return note[start][end]; } } else if(s[start]=='N') { if(IsCorrect(s,start+1,end)==0) { note[start][end]=1; return note[start][end]; } else if(IsCorrect(s,start+1,end)==1) { note[start][end]=0; return note[start][end]; } else { note[start][end]=2; return note[start][end]; } } else if(s[start]=='E'||s[start]=='C'||s[start]=='A'||s[start]=='K') { int sig=2; for(i=1;i<end-start;i++) { int a=IsCorrect(s,start+1,start+i);note[start+1][start+i]=a; int b=IsCorrect(s,start+i+1,end);note[start+i+1][end]=b; if(a<=1 && b<=1) { switch(s[start]) { case'K':sig=(a&&b);break; case'A':sig=(a||b);break; case'C':sig=(!a||b);break; case'E':sig=!(a^b);break; } } if(sig==1) return note[start][end]=1; } return note[start][end]=sig; } else { return (note[start][end]=2); } } int main() { //freopen("input.txt","r",stdin); int len,i,j; char s[260]; while((scanf("%s",s))!=EOF) { if(strcmp(s,"0")==0) break; len=strlen(s); memset(arr,0,sizeof(arr)); flag=1; for(i=0;i<32;i++) { for(j=0;j<5;j++) arr[j]=(i>>j)%2; for(int p=0;p<len;p++) for(int q=0;q<len;q++) note[p][q]=-1; flag=IsCorrect(s,0,len-1); if(flag!=1) break; } if(flag==1) printf("tautology\n"); else printf("not\n"); } return 0; }
2)别人的思路:用栈模拟0MS
【程序】:
#include<iostream> #include<string> #include<stack> using namespace std; bool Judge(int p,int q,int r,int s,int t,string st) { stack<int> s_num; int buff_1,buff_2; string::size_type n = st.size(); for(n=n-1;n!=-1;n--) { if(st[n]<='t'&&st[n]>='p') { switch(st[n]) { case 't':s_num.push(t);continue; case 's':s_num.push(s);continue; case 'r':s_num.push(r);continue; case 'q':s_num.push(q);continue; case 'p':s_num.push(p);continue; } } else { if(st[n]=='N') { buff_1 = s_num.top();s_num.pop(); s_num.push(!buff_1); } else if(st[n]=='A') { buff_1 = s_num.top();s_num.pop(); buff_2 = s_num.top();s_num.pop(); s_num.push(buff_2||buff_1); } else if(st[n]=='K') { buff_1 = s_num.top();s_num.pop(); buff_2 = s_num.top();s_num.pop(); s_num.push(buff_2&&buff_1); } else if(st[n]=='E') { buff_1 = s_num.top();s_num.pop(); buff_2 = s_num.top();s_num.pop(); s_num.push(buff_2==buff_1); } else { buff_1 = s_num.top();s_num.pop(); buff_2 = s_num.top();s_num.pop(); s_num.push((!buff_1)||buff_2); } } } //cout<<s_num.top()<<endl; if(!s_num.top()) return false; return true; } int main() { string st; while(cin>>st) { string::size_type i = 0; if(st[i]=='0') break; int p(0),q(0),r(0),s(0),t(0),flag(0); for(p=0;p!=2;p++) { for(q=0;q!=2;q++) { for(r=0;r!=2;r++) { for(s=0;s!=2;s++) { for(t=0;t!=2;t++) { if(!Judge(p,q,r,s,t,st)) { flag=1; } } if(flag==1) break; } if(flag==1) break; } if(flag==1) break; } if(flag==1) break; } if(flag==1) cout<<"not"<<endl; else cout<<"tautology"<<endl; } return 0; }