多段图问题是一种特殊的动态规划。
状态转移像是一种跳跃。
动态规划的值是路径数。
对于每一个状态,遍历所有可以转移的下一个状态,然后把自己的路径数加给它。
或者对于每一个状态,遍历所有可以转移给他的状态,然后把它的路径数加给自己。
题目往往会问有多少个,有多少种。
一般来讲有两种解法:
第一种是先枚举状态,再枚举转移,这时所求的路径数是转移的排列。上一题便是如此。
第二种先枚举转移,再枚举状态,这时所求的路径数是转移的组合,这一题便是如此。
感觉大白书上有时喜欢给出一些不那么优秀的代码,然后再告诉你可以改进。
反正觉得过题数真的没什么用,关键是你思考了多少。
用了各种姿势,挑了一个最好的代码
#include<bits/stdc++.h>
#define maxn 10010
using namespace std;
typedef long long ll;
ll dp[maxn];
void init()
{
memset(dp,0,sizeof(dp));
dp[0]=1;
for(ll i=1;i<25;i++)
for(ll j=0;j+i*i*i<maxn;j++)
dp[j+i*i*i]+=dp[j];
}
int main()
{
init();
ll n;
while(~scanf("%lld",&n)) printf("%lld\n",dp[n]);
return 0;
}