昨天看了一天的《天堂绣》,挺好看的,顺便给各位推荐,既偶像(陆毅+韩智慧异国恋);又有底蕴,讲述中国苏州的手绣古董流失海外和手绣艺术向海外的传播。
今天下午才开始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;
}
到这里我终于知道枚举枚的好也是很强大的。看我们选择怎么样去枚举。