昨天看了一天的《天堂绣》,挺好看的,顺便给各位推荐,既偶像(陆毅+韩智慧异国恋);又有底蕴,讲述中国苏州的手绣古董流失海外和手绣艺术向海外的传播。
今天下午才开始A题,又水了四道。终于到了第二单元。
代码:
numtri: 数塔,如此简单的动规。
代码:
/* ID: duanjia2 PROG: numtri LANG: C++ */ #include<iostream> #include<string.h> #include<fstream> #include<stdio.h> using namespace std; int tow[1001][1002]; int main() { ifstream fin("numtri.in"); ofstream fout("numtri.out"); int n,i,j,a; memset(tow,0,sizeof(tow)); fin>>n; for( i=1;i<=n;i++) for( j=1;j<=i;j++){ fin>>a; tow[i][j]=max(tow[i-1][j-1],tow[i-1][j])+a; } int mx=0; for( i=1;i<=n;i++) if(mx<tow[n][i]) mx=tow[n][i]; fout<<mx<<endl; // system("pause"); return 0; }pprime: 即使回文又是素数。我先枚举回文在判断素数,有提示的哟.我可是纯枚举。
代码:
/* ID: duanjia2 PROG: pprime LANG: C++ */ #include<iostream> #include<string.h> #include<fstream> #include<vector> using namespace std; bool Isprime(int num) { for(int i=2;i*i<=num;i++) if(num%i==0) return false; return true; } int main() { ifstream fin("pprime.in"); ofstream fout("pprime.out"); int i,j,s,m,k,num,a,b; s=0; fin>>a>>b; if( a<=2&&b>=2) cout<<2<<endl; for( i=3;i<=7;i+=2) if(i>=a&&i<=b) fout<<i<<endl; if( a<=11&&b>=11) fout<<11<<endl; bool flag=true; if( b>100&&a<1000){ for( i=1;i<=9&&flag;i+=2) //3位回文 for( j=0;j<=9;j++){ num=i*100+j*10+i; if(num<a) continue; if(num>b){ flag=false; break;} if( Isprime(num)) fout<<num<<endl; } } if( b>1000&&a<10000){ for( i=1;i<=9&&flag;i+=2) //4位回文 for( j=0;j<=9;j++){ num=i*1000+j*100+j*10+i; if(num<a) continue; if(num>b){ flag=false; break;} if( Isprime(num)) fout<<num<<endl; } } if( b>10000&&a<100000){ for( i=1;i<=9&&flag;i+=2) //5位回文 for( j=0;j<=9&&flag;j++) for( k=0;k<=9;k++){ num=i*10000+j*1000+k*100+j*10+i; if(num<a) continue; if(num>b){ flag=false; break;} if( Isprime(num)) fout<<num<<endl; } } if( b>100000&&a<1000000){ for( i=1;i<=9&&flag;i+=2) //6位回文 for( j=0;j<=9&&flag;j++) for( k=0;k<=9;k++){ num=i*100000+j*10000+k*1000+k*100+j*10+i; if(num<a) continue; if(num>b){ flag=false; break;} if( Isprime(num)) fout<<num<<endl; } } if( b>1000000&&a<10000000){ for( i=1;i<=9&&flag;i+=2) //7位回文 for( j=0;j<=9&&flag;j++) for( k=0;k<=9&&flag;k++) for( m=0;m<=9;m++){ num=i*1000000+j*100000+k*10000+m*1000+k*100+j*10+i; if(num<a) continue; if(num>b){ flag=false; break;} if( Isprime(num)) fout<<num<<endl; } } // system("pause"); return 0; }sprime: 一个数,从后往前去掉几位剩下的还是素数。7331 ,733,73,7都是素数。
枚举,都是枚举,崩溃。
代码:
/* ID: duanjia2 PROG: sprime LANG: C++ */ #include<iostream> #include<fstream> using namespace std; ifstream fin("sprime.in"); ofstream fout("sprime.out"); bool Isprime(int n) { for(int i=2;i*i<=n;i++) if(n%i==0) return false; return true; } void Fn(int n,int cnt) { int temp; if( n==0){ fout<<cnt<<endl; return; } if( cnt==0){ //第一位可以为2,不可以为1,9 Fn( n-1,2 ); for(int i=3; i<=7; i+=2){ Fn( n-1,i ); } } else{ //结尾只能为奇数,不然能被2除 for(int i=1; i<=9; i+=2){ temp=cnt*10+i; if( Isprime(temp) ) Fn( n-1,temp ); } } } int main() { int n; fin>>n; Fn(n,0); // system("pause"); return 0; }checker: n皇后问题,就是要输出前三种的解,按升序输出。我们按升序枚举就好了。
代码:
/* ID: duanjia2 PROG: checker LANG: C++ */ #include<iostream> #include<string.h> #include<fstream> using namespace std; ifstream fin("checker.in"); ofstream fout("checker.out"); int col[15],n,cnt,ans[5][15],vis[3][30]; void Search(int cur) { if( cur==n){ if( cnt<3){ for(int i=0;i<n;i++) ans[cnt][i]=(col[i]+1); } cnt++; return ; } else{ for(int i=0; i<n; i++){ if( !vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+n] ){ //如果列和对角线没有被占据 col[cur]=i; vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1; Search(cur+1); vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0; } } } } int main() { int i,j; fin>>n; memset(vis,0,sizeof(vis)); cnt=0; Search(0); for( i=0;i<3;i++){ fout<<ans[i][0]; for( j=1;j<n;j++) fout<<' '<<ans[i][j]; fout<<endl; } fout<<cnt<<endl; // system("pause"); return 0; }到这里我终于知道枚举枚的好也是很强大的。看我们选择怎么样去枚举。