本文主要是介绍01.27,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1,int jishu (int sum1,int sum2,int sum3)//首先在这里可以做一个函数,这个函数的作用很简单,就是判断是不是1到9都有了:
{int i1,i2,i3,j1,j2,j3,k1,k2,k3;i1=sum1%10;i2=(sum1/10)%10;i3=sum1/100;j1=sum2%10;j2=(sum2/10)%10;j3=sum2/100;k1=sum3%10;k2=(sum3/10)%10;k3=sum3/100;//拆分每个三位数,相信这个大家都看得懂吧; if ((i1*i2*i3*j1*j2*j3*k1*k2*k3==362880)&&(i1+i2+i3+j1+j2+j3+k1+k2+k3==45)) return 1;//这里稍微说明一下://1到 9的和是45,乘积是362880,没有其他的九个数是能模仿出来的,在这里用了个小技巧,节约时间。 else return 0;
}
2.洛谷P1464 Function
对于一个递归函数w(a,b,c)
如果a<=0 or b<=0 or c<=0就返回值1.
如果a>20 or b>20 or c>20就返回w(20,20,20)
如果a<b并且b<c 就返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)
其它别的情况就返回w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1)
这是个简单的递归函数,但实现起来可能会有些问题。当a,b,c均为15时,调用的次数将非常的多。你要想个办法才行.
/*
absi2011 : 比如 w(30,-1,0)既满足条件1又满足条件2
这种时候我们就按最上面的条件来算
所以答案为1
*/
输入输出格式
输入格式:
会有若干行.
并以-1,-1,-1结束.
保证输入的数在-9223372036854775808~9223372036854775807之间
并且是整数
输出格式:
输出若干行
格式:
[b]w(a,_b,_c)_=_你的输出(_代表空格)[/b]
题解
#include<bits/stdc++.h>//万能头文件
using namespace std;
long long f[25][25][25];//怕数据太大,用了long long,记录已计算过的w(a,b,c)的值
long long dfs(long long a,long long b,long long c)//深搜函数dfs,计算w(a,b,c)的值
{if(a<=0||b<=0||c<=0) return 1;//如果有小于等于0的,返回1if(a>20||b>20||c>20) return dfs(20,20,20);//如果有大于20的,返回w(20,20,20)if(a<b&&b<c) {if(f[a][b][c]==-1) f[a][b][c]=dfs(a,b,c-1)+dfs(a,b-1,c-1)-dfs(a,b-1,c);}//如果a<b且b<c,没被计算过,就进行计算,保留结果else if(f[a][b][c]==-1) f[a][b][c]=dfs(a-1,b,c)+dfs(a-1,b-1,c)+dfs(a-1,b,c-1)-dfs(a-1,b-1,c-1);//如果前面都不对,没被计算过,就进行计算,保留结果return f[a][b][c];//最后返回值
}
int main()//愉快的开始了主程序
{memset(f,-1,sizeof(f));//将所有记忆物清除long long a,b,c;do{cin>>a>>b>>c;if(a!=-1||b!=-1||c!=-1) printf("w(%d, %d, %d) = %d\n",a,b,c,dfs(a,b,c));//中间的空格是坑}while(a!=-1||b!=-1||c!=-1);//让里面先输入,再判断return 0;//愉快的结束了主程序
}
这篇关于01.27的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!