poj_1579 && hdoj_1331
2012-12-03 09:59
316 查看
Function Run Fun
Description
We all love recursion! Don't we?
Consider a three-parameter recursive function w(a, b, c):
if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns:
1
if a > 20 or b > 20 or c > 20, then w(a, b, c) returns:
w(20, 20, 20)
if a < b and b < c, then w(a, b, c) returns:
w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
otherwise it returns:
w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
This is an easy function to implement. The problem is, if implemented directly, for moderate values of a, b and c (for example, a = 15, b = 15, c = 15), the program takes hours to run because of the massive recursion.
Input
The input for your program will be a series of integer triples, one per line, until the end-of-file flag of -1 -1 -1. Using the above technique, you are to calculate w(a, b, c) efficiently and print the result.
Output
Print the value for w(a,b,c) for each triple.
Sample Input
Sample Output
之前用记忆化搜索写过。
三个for循环,从w[0][0][0]递推到w[20[20][20]
//#include<iostream>
//#include<cstdio>
//#include<cstring>
//using namespace std;
//int w[100][100][100];
//
//int DFS(int a,int b,int c)
//{
// if(a<=0 || b<=0 || c<=0)
// {
// return 1;
// }
// if(a>20 || b>20 || c>20)
// {
// return DFS(20,20,20);
// }
// if(w[a][b][c]!=-1)
// {
// return w[a][b][c];
// }
// if(a<b && b<c)
// {
// w[a][b][c] = DFS(a, b, c-1) + DFS(a, b-1, c-1) - DFS(a, b-1, c);
// }
// else
// {
// w[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 w[a][b][c];
//}
//int main()
//{
// freopen("in.txt","r",stdin);
// int i,j,k;
// memset(w,-1,sizeof(w));
// while(cin>>i>>j>>k)
// {
// if(i==-1&&j==-1&&k==-1)
// break;
// printf("w(%d, %d, %d) = %d\n",i,j,k,DFS(i,j,k));
// }
//}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int w[25][25][25];
int main()
{
freopen("in.txt","r",stdin);
int i, j, k, a, b, c;
memset(w, 0, sizeof(w));
for(i=0; i<=20; i++)
{
for(j=0; j<=20; j++)
{
for(k=0; k<=20; k++)
{
if(i == 0 || j == 0 || k == 0)
{
w[i][j][k] = 1;
}
else if(i < j && j < k)
{
w[i][j][k] = w[i][j][k-1] + w[i][j-1][k-1] - w[i][j-1][k];
}
else
{
w[i][j][k] = w[i-1][j][k] + w[i-1][j-1][k] + w[i-1][j][k-1] - w[i-1][j-1][k-1];
}
}
}
}
while(cin >> a >> b >> c)
{
if(a == -1 && b == -1 && c == -1)
break;
if(a <= 0 || b <= 0 || c <= 0)
printf("w(%d, %d, %d) = %d\n",a,b,c,1);
else if(a > 20 || b > 20 || c > 20)
printf("w(%d, %d, %d) = %d\n",a,b,c,w[20][20][20]);
else
printf("w(%d, %d, %d) = %d\n",a,b,c,w[a][b][c]);
}
return 0;
}
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 13554 | Accepted: 7056 |
We all love recursion! Don't we?
Consider a three-parameter recursive function w(a, b, c):
if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns:
1
if a > 20 or b > 20 or c > 20, then w(a, b, c) returns:
w(20, 20, 20)
if a < b and b < c, then w(a, b, c) returns:
w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
otherwise it returns:
w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
This is an easy function to implement. The problem is, if implemented directly, for moderate values of a, b and c (for example, a = 15, b = 15, c = 15), the program takes hours to run because of the massive recursion.
Input
The input for your program will be a series of integer triples, one per line, until the end-of-file flag of -1 -1 -1. Using the above technique, you are to calculate w(a, b, c) efficiently and print the result.
Output
Print the value for w(a,b,c) for each triple.
Sample Input
1 1 1 2 2 2 10 4 6 50 50 50 -1 7 18 -1 -1 -1
Sample Output
w(1, 1, 1) = 2 w(2, 2, 2) = 4 w(10, 4, 6) = 523 w(50, 50, 50) = 1048576 w(-1, 7, 18) = 1
之前用记忆化搜索写过。
三个for循环,从w[0][0][0]递推到w[20[20][20]
注意题目的优先计算顺序。先是考虑是否会小于0,然后才考虑是否会大于20,要不然就会WA。
//#include<iostream>
//#include<cstdio>
//#include<cstring>
//using namespace std;
//int w[100][100][100];
//
//int DFS(int a,int b,int c)
//{
// if(a<=0 || b<=0 || c<=0)
// {
// return 1;
// }
// if(a>20 || b>20 || c>20)
// {
// return DFS(20,20,20);
// }
// if(w[a][b][c]!=-1)
// {
// return w[a][b][c];
// }
// if(a<b && b<c)
// {
// w[a][b][c] = DFS(a, b, c-1) + DFS(a, b-1, c-1) - DFS(a, b-1, c);
// }
// else
// {
// w[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 w[a][b][c];
//}
//int main()
//{
// freopen("in.txt","r",stdin);
// int i,j,k;
// memset(w,-1,sizeof(w));
// while(cin>>i>>j>>k)
// {
// if(i==-1&&j==-1&&k==-1)
// break;
// printf("w(%d, %d, %d) = %d\n",i,j,k,DFS(i,j,k));
// }
//}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int w[25][25][25];
int main()
{
freopen("in.txt","r",stdin);
int i, j, k, a, b, c;
memset(w, 0, sizeof(w));
for(i=0; i<=20; i++)
{
for(j=0; j<=20; j++)
{
for(k=0; k<=20; k++)
{
if(i == 0 || j == 0 || k == 0)
{
w[i][j][k] = 1;
}
else if(i < j && j < k)
{
w[i][j][k] = w[i][j][k-1] + w[i][j-1][k-1] - w[i][j-1][k];
}
else
{
w[i][j][k] = w[i-1][j][k] + w[i-1][j-1][k] + w[i-1][j][k-1] - w[i-1][j-1][k-1];
}
}
}
}
while(cin >> a >> b >> c)
{
if(a == -1 && b == -1 && c == -1)
break;
if(a <= 0 || b <= 0 || c <= 0)
printf("w(%d, %d, %d) = %d\n",a,b,c,1);
else if(a > 20 || b > 20 || c > 20)
printf("w(%d, %d, %d) = %d\n",a,b,c,w[20][20][20]);
else
printf("w(%d, %d, %d) = %d\n",a,b,c,w[a][b][c]);
}
return 0;
}
相关文章推荐
- poj_1579 && hdoj_1331
- hdoj_2586How far away ? && poj_1986Distance Queries
- 【贪心】【POJ-1065&&HDOJ-1051&&AOJ-224】Wooden Sticks
- POJ1579 HDOJ1579 Function Run Fun
- hdoj 1028/poj 2704 Pascal's Travels(记忆化搜索||dp)
- hdoj 1432 && poj 2606 Lining Up (多点共线)
- poj 1543 & HDU 1334 & ZOJ 1331 Perfect Cubes(数学 暴力大法好)
- POJ-1142 & HDOJ-1333 Smith Numbers 解题报告
- poj-1979 && hdoj - 1312 Red and Black (简单dfs)
- HDU 1331 poj 1579记忆化搜索
- HDOJ 1540 && POJ 2892 —— 线段树
- 最近点对问题 POJ 3714 Raid && HDOJ 1007 Quoit Design
- hdoj 2224 && poj 2677 The shortest path 【TSP】
- HDOJ 1400 & POJ 2411 - Mondriaan's Dream 状态压缩DP
- hdoj 1542 && poj 1151 Atlantis && poj 1389 Area of Simple Polygons 【线段树 + 离散化 + 扫描线】
- POJ 2062 & HDOJ 1528 Card Game Cheater - 阅读理解..二分图最大匹配
- poj 3696 &&hdoj 2462 The Luckiest number(同余&欧拉) 好题
- LA-2523 & POJ-1325 & HDOJ-1150 Machine Schedule 解题报告
- POJ 1521 && HDOJ 1053
- ACM: 动态规划 poj 1579