话说cdsn要是前面插入源代码又什么都不放就会出现奇怪的源代码?不知道是哪个网页的
给定一个
有多组数据,EOF结束。
每行对应一个answer
6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
6 8
.....#.#
##.....#
###...##
.......#
##.....#
#..#...#
There are 5 ships.
So Sad
#include <cstdio> using namespace std; int len[1000][1000]; int width[1000][1000]; int readchar(){//just want to sleep while(1){ char ch=getchar(); if(ch=='#')return 1; if(ch=='.')return 0; if(ch==EOF)return -1; } } int main() { int n,m; while(scanf("%d %d",&n,&m)==2){ for(int i=0;i<n;i++){ int l=0; for(int j=0;j<m;j++){ int chsign=readchar(); if(chsign==0){ len[i][j]=0; l=0; } else if(chsign==1){ len[i][j]=l+1; l++; } } } bool ans=true; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(len[i][j]==0){ width[i][j]=0; if(i&&len[i-1][j]&&j&&len[i][j-1]){ ans=false; break; } } if(i==0||(len[i-1][j]==0&&len[i][j+1]==0))width[i][j]=1; if(i&&len[i-1][j]!=len[i][j]&&len[i-1][j]&&len[i][j]){ ans=false; break; } } if(!ans)break; } int ansi =0; for(int i=n-1;i>=0;i--){ for(int j=m-1;j>=0;j--){ if(len[i][j]==0)continue; if(i-1>=0&&len[i-1][j])continue; if(j-1>=0&&len[i][j-1])continue; ansi++; } } if(!ans)printf("So Sad\n"); else printf("There are %d ships.\n",ansi); } return 0; }
用关系“<”和“=”将3个数A、B和C依序排列时有13种不同的序关系:
现在输入数字的个数,要求你给出上述关系的数目。
数的个数不大于100
多组数据,EOF结束
每行一个输入
对于每个输入,输出一行,即对应答案
3
13
明显是递推,但是递推公式推错了囧,而且还狂交一气
其实是dp
但是应该把当前状态分解成子状态,dp[n][m],递增的m个位置塞下n个字母,且没有位置是空的
import java.math.*; import java.util.Scanner; import java.io.*; public class Main { public static void main(String args[]){ BigInteger dp[][]=new BigInteger [101][101]; BigInteger ans[]=new BigInteger[101]; ans[0]=BigInteger.ZERO; for(int i=0;i<101;i++){ for(int j=0;j<101;j++){ dp[i][j]=BigInteger.ZERO; } } dp[1][1]=BigInteger.ONE; for(int i=2;i<101;i++){ for(int j=1;j<=i;j++){ dp[i][j]=(dp[i-1][j-1].add(dp[i-1][j])); dp[i][j]=dp[i][j].multiply(BigInteger.valueOf(j)); } } for(int i=1;i<101;i++){ ans[i]=BigInteger.ZERO; for(int j=1;j<=i;j++){ ans[i]=ans[i].add(dp[i][j]); } } Scanner cin=new Scanner(System.in); while(cin.hasNext()){ int n=cin.nextInt(); System.out.println(ans[n]); } } }
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> using namespace std; void print(int p[]){ printf("%d",p[p[0]]);//p[0]用于保存长度(数组) for(int i=p[0]-1;i>=1;i--){ printf("%d",p[i]/1000%10);//防止有缺失,如某个数位上为0001的情况 printf("%d",p[i]/100%10); printf("%d",p[i]/10%10); printf("%d",p[i]%10); } printf("\n"); } void bigintegeradd(int sum[],int p1[],int p2[]){ sum[0]=max(p1[0],p2[0]); for(int i=1;i<=sum[0];i++){ sum[i]=p1[i]+p2[i];//ATTENTION高位需置为0 } for(int i=1;i<=sum[0];i++){ sum[i+1]+=sum[i]/10000; sum[i]%=10000; } if(sum[sum[0]+1]){ sum[0]++;//加法进位一位 } } void bigmultiply(int mul[],int p1[],int p2[]){ mul[0]=p1[0]+p2[0];//至少要有p1 p2长度之和+1长度 for(int i=1;i<=p1[0];i++){//不能自身同时为参数mul和p for(int j=1;j<=p2[0];j++){ mul[i+j-1]=p1[i]*p2[j]; } for(int j=1;j<=mul[0];j++){ mul[j+1]=mul[j]/10000; mul[j]%=10000; } } for(int i=mul[0]+1;i>=1;i--){ if(mul[i]==0){mul[0]--;} else break; } } void bigmultiplysingle(int p[],int a){//改变自身 for(int i=1;i<=p[0];i++){ p[i]*=a; } for(int i=1;i<=p[0];i++){ p[i+1]+=p[i]/10000; p[i]%=10000; } while(p[p[0]+1]>0){ p[0]++; p[p[0]+1]=p[p[0]]/10000; p[p[0]]%=10000; } } int dp[101][101][101]; int ans[101][203]; int main(){ for(int i=1;i<101;i++){ dp[i][1][0]=1; dp[i][1][1]=1; for(int j=2;j<=i;j++){ bigintegeradd(dp[i][j],dp[i-1][j],dp[i-1][j-1]); // printf("dp[i-1][j-1] "); // print(dp[i-1][j-1]); // printf("dp[i-1][j] "); // print(dp[i-1][j]); // printf("after add :dp[i][j] "); // printf("dp[i][j]len: %d\n",dp[i][j][0]); //print(dp[i][j]); // printf("after multiply %d: ",j); bigmultiplysingle(dp[i][j],j); // print(dp[i][j]); // for(int k=dp[i][j][0];k>0;k--)printf("%d",dp[i][j][k]); // printf("\n"); //printf("dp[i][j]len: %d\n\n",dp[i][j][0]); } } for(int i=1;i<101;i++){ for(int j=1;j<101;j++){ bigintegeradd(ans[i],ans[i],dp[i][j]); } } int n; while(scanf("%d",&n)==1){ print(ans[n]); } }