poj 3295 Tautology(经典构造算法题)
生活随笔
收集整理的這篇文章主要介紹了
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");elseprintf("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;elsecout<<"tautology"<<endl;}return 0; }
?
?
轉載于:https://www.cnblogs.com/litaotao/p/3592463.html
總結
以上是生活随笔為你收集整理的poj 3295 Tautology(经典构造算法题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 3164 Command Net
- 下一篇: shell变量$#,$@,$0,$1,$