最近要刷DP!弱爆了!!!
方程dp[i][j]=sum(dp[i-j][k]),0<k<j,表示i块砖头砌成的最大高度为j。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <deque>
#include <stack>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
#include <time.h>
using namespace std;
int lowbit(int t){return t&(-t);}
int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
#define LL long long
#define PI acos(-1.0)
#define N 401
#define MAX INT_MAX
#define MIN INT_MIN
#define eps 1e-8
#define FRE freopen("a.txt","r",stdin)
//dp[i][j]=sum(dp[i-j][k]),0<k<j
LL dp[501][501];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int i,j,k;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
for(k=0;k<j;k++){
dp[i][j]+=dp[i-j][k];
}
}
}
LL ans=0;
for(i=1;i<n;i++)
ans+=dp[n][i];
printf("%I64d\n",ans);
}
return 0;
}
本文详细探讨了动态规划算法的基本概念、核心方程及其在解决特定问题时的应用实例。通过具体代码实现,展示了如何利用动态规划解决复杂的组合优化问题。
392

被折叠的 条评论
为什么被折叠?



