HDU 1331--DP--(递归保存中间结果)

题意:题目给出了递归计算式,让你编程用这个计算式求出结果。

分析:递归会超时,用DP保留中间结果。DP不光是只有状态转移方程还可以用于递归保存中间结果以节约时间。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int dp[100][100][100];
int DP(int a,int b,int c)
{
    if(a<=0||b<=0||c<=0) return 1;
    else if(a>20||b>20||c>20) return DP(20,20,20);
    else if(a<b&&b<c){
        if(dp[a][b][c])
          return dp[a][b][c];
        else dp[a][b][c]=DP(a,b,c-1)+DP(a,b-1,c-1)-DP(a,b-1,c);
     }
    else{
        if(dp[a][b][c])
          return dp[a][b][c];
        else dp[a][b][c]=DP(a-1,b,c)+DP(a-1,b-1,c)+DP(a-1,b,c-1)-DP(a-1,b-1,c-1);
    }
    return dp[a][b][c];
}
int main()
{
    int a,b,c;
    while(cin>>a>>b>>c){
        if(a==-1&&b==-1&&c==-1) break;
        memset(dp,sizeof(dp),0);
        cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<DP(a,b,c)<<endl;
    }
}
时间: 2024-11-07 06:18:30

HDU 1331--DP--(递归保存中间结果)的相关文章

HDU 1331 Function Run Fun

Function Run Fun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2173    Accepted Submission(s): 1104 Problem Description We all love recursion! Don't we? Consider a three-parameter recursive fu

HDU 4832(DP+计数问题)

HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行,然后相乘累加起来就是答案 代码: #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long ll; const ll MOD = 9999991; const int N = 1005; int t, n, m, k, x, y; ll dp1

hdu 3944 dp?

DP? Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 128000/128000 K (Java/Others)Total Submission(s): 1804    Accepted Submission(s): 595 Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0,1,2,-a

hdu 5389 dp类似背包

http://acm.hdu.edu.cn/showproblem.php?pid=5389 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi (you may hear about ever17?) and developed by Chunsoft. Stilwell is enjoying the first chapter of this

hdu 1025 dp 最长上升子序列

1 //Accepted 4372 KB 140 ms 2 //dp 最长上升子序列 nlogn 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 const int imax_n = 500005; 8 int dp[imax_n]; 9 int d[imax_n]; 10 int a[imax_n]; 11 int n; 12 int len

HDU 5928 DP 凸包graham

给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也就是 dp[j][k]代表当前链末端为j,其内部点包括边界数量为k的最小长度.这样最后得到的一定是最优的凸包. 然后就是要注意要dp[j][k]的值不能超过L,每跑一次凸包,求个最大的点数量就好了. 和DP结合的计算几何题,主要考虑DP怎么搞 /** @Date : 2017-09-27 17:27

HDU 4901 DP背包

给你n个数,问你将数分成两个数组,S,T ,T 中所有元素的需要都比S任意一个大,问你S中所有元素进行 XOR 操作和 T 中所有元素进行 &操作值相等的情况有多少种. DP背包思路 dpa[i][j][0]  表示从左开始到i,不取i,状态为j的方案数 dpa[i][j][1]  表示从作开始到i,取i,状态为j的方案数 dpb[i][j]      表示从右开始到i,状态为j的方案数 因为S集合一定在T集合的左边,那么可以枚举集合的分割线,并且枚举出的方案要保证没有重复,如果要保证不重复,只

hdu 1160 dp 入门

链接http://acm.hdu.edu.cn/showproblem.php?pid=1160 感觉也是最长上升子序列的变形... 这回独立1Y!开心~  不过在保存路径的时候调了一段时间orzzzzz还是太弱 思路:每个老鼠进行排序,将体重从小到大,若相等再将速度从大到小,保证找出最多的. 定义dp[i]表示以i为末尾的满足条件的最长的序列长度.运用最长上升子序列的那种方法就可以做了,还有要注意的是因为需要将其进行排序,排序后的序号是乱的,所以需要在结构体中加入一个记录原本路径的元素num.

HDU 1331 Function Run Fun(记忆化搜索)

Problem 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)