ACM代码整理.docx
《ACM代码整理.docx》由会员分享,可在线阅读,更多相关《ACM代码整理.docx(10页珍藏版)》请在冰豆网上搜索。
ACM代码整理
排列组合问题
publicclass数的分解{
publicstaticvoidmain(String[]args){
inta[]=newint[100];
intn=6;
f(10,a,0);
}
publicstaticvoidf(intn,inta[],intk){
if(n<=0){
for(inti=0;iSystem.out.print(a[i]+"");
}
System.out.println();
return;
}
for(inti=n;i>0;i--){
if(k>0&&i>a[k-1])
continue;
a[k]=i;
f(n-i,a,k+1);
}
}
}
组合排列:
publicclass打印组合排列数{
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
charc[]=sc.next().toCharArray();
charb[];
for(inti=1;i<=c.length;i++){
b=newchar[3];
组合(c.length,3,c,b);
}
}
publicstaticvoid组合(intn,intk,charc[],charb[]){
inti;
if(k==0){
Strings="";
for(intj=0;jSystem.out.print(b[j]);
}
System.out.println();
全排列(0,s.toCharArray());
return;
}else{
for(intj=0;jb[k-1]=c[j];
组合(j,k-1,c,b);
}
}
}
publicstaticvoid全排列(intk,charc[]){
if(k>=c.length){
for(inti=0;iSystem.out.print(c[i]);
}
System.out.println();
return;
}
for(inti=k;i{chartemp=c[i];c[i]=c[k];c[k]=temp;}
全排列(k+1,c);
{chartemp=c[i];c[i]=c[k];c[k]=temp;}
}
}
}
importjava.util.Scanner;
整数部分和
publicclass整数部分和{
staticintsum=0;
staticbooleanvisit[]=newboolean[40];
staticbooleanflag=false;
staticinta[]=newint[40];
staticintn,k;
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
while(sc.hasNextInt()){
n=sc.nextInt();
k=sc.nextInt();
for(inti=0;ia[i]=sc.nextInt();
visit[i]=false;
}
flag=false;
dfs(0);
if(flag==false)
System.out.println("NO");
}
}
publicstaticvoiddfs(intpos){
//if(flag)
//return;
if(sum>=k){
if(sum==k){
if(!
flag){
flag=true;
System.out.println("YES");
}
for(inti=0;iif(visit[i])
System.out.print(a[i]+"");
}
System.out.println();
}
return;
}
for(inti=pos;isum+=a[i];
visit[i]=true;
dfs(i+1);
sum-=a[i];
visit[i]=false;
}
}
}
动态规划
单调递增子函数
#include
#include
constintmaxn=10001;
chars[maxn];
intdp[maxn],Max;
voidLICS()
{
intlen;
memset(dp,0,sizeof(dp));
len=strlen(s);
for(inti=0;i{
dp[i]=1;//给定一个数组求的时候,初始值就是1,一个数组的最大序列肯定会有一个字符;
for(intj=0;j
{
if(s[i]>s[j]&&dp[i]<1+dp[j])//递推公式,如果这个位置比前面的字符都大,就加入到递增序列中来
dp[i]=1+dp[j];
}
}
Max=0;
for(inti=0;iif(MaxMax=dp[i];
}
intmain()
{
intt;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
LICS();
printf("%d\n",Max);
}
return0;
}
公共最长子序列
#include
#include
#definemax(a,b)a>b?
a:
b
usingnamespacestd;
constintmaxn=1001;
intdp[maxn][maxn];//保存当前位置最长公共子序列的个数
chars1[maxn],s2[maxn];
intmain()
{
intn;
intlen1,len2;
scanf("%d",&n);
getchar();
while(n--)
{
memset(dp,0,sizeof(dp));
scanf("%s%s",s1,s2);
len1=strlen(s1);
len2=strlen(s2);
for(inti=1;i<=len1;i++)
for(intj=1;j<=len2;j++)
{
if(s1[i-1]==s2[j-1])//先前这个地方写成s1[i]==s2[j]就一直wa不知道为什么,样例都能过
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
printf("%d\n",dp[len1][len2]);
}
return0;
}
dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
大数问题:
publicclass数字分割{
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
while(sc.hasNext()){
Stringn=sc.nextLine().trim();
NumberFormatnf=NumberFormat.getInstance();
nf.setGroupingUsed(true);
nf.setMaximumFractionDigits
(2);
nf.setMinimumFractionDigits
(2);
nf.setRoundingMode(RoundingMode.HALF_UP);
BigDecimalss=newBigDecimal(n);
BigDecimalo=newBigDecimal("-0.000001");
if(pareTo(o)<1){
System.out.print("(");
System.out.print(nf.format(ss.multiply(newBigDecimal("-1"))));
System.out.println(")");
}else{
System.out.println(nf.format(ss));
}
}
}
}
高精度幂次方
publicclass高精度幂次方{
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
while(sc.hasNextBigDecimal()){
BigDecimalR=sc.nextBigDecimal().stripTrailingZeros();
intn=sc.nextInt();
DecimalFormatdf=newDecimalFormat("");
df.setGroupingUsed(false);
if(R.pow(n).compareTo(BigDecimal.ONE)<0){
if(R.pow(n).equals(BigDecimal.ZERO)||R.pow(n).toString().length()<=3)
System.out.println(0);
else
System.out.println(df.format(newBigDecimal(R.pow(n).toPlainString().substring
(1))));
}
else
System.out.println(df.format(R.pow(n)));
}
}
}