HDU 1028 Ignatius and the Princess III
程序员文章站
2024-03-21 18:53:46
...
Ignatius and the Princess III HDU-1028
题目大意:
给定一个数字n,求有多少种用加数相加得到n的方式
如:
n=4
4 = 4 + 0
4 = 3 + 1
4 = 2 + 2
4 = 2 + 1 + 1
4 = 1 + 1 + 1 + 1
需要注意的是 3+1 和 1+3 算同一种 不重复统计
分析:
设出两个未知量num(上式中的4)和m,分别代表“要求的这个数字”和“组成这个数字的最大加数”。
如果num小于m,那么这是不存在的。
DP[num][m]=DP[num][num]
如果num等于m,那么
DP[num][m]=DP[num][m-1]+1
如果num大于m,这是最常规的情况
就像DP[10][4]就等于DP[10][3]+DP[6][4]
DP[num][m]=DP[num][m-1]+DP[num-m][m]
AC代码:
#include <iostream>
#include <cstring>
#define MAX 126
using namespace std;
int DP[MAX][MAX];
int main(){
memset(DP,0,sizeof(DP));
//设要求的这个数是num 它的最大加数是m的时候
//先初始化
for(int num=1;num<=125;num++){
DP[num][1]=1;
DP[1][num]=1;
}
//开始打表
for(int num=2;num<=125;num++){
for(int m=2;m<=125;m++){
if(num<m) //最大的加数比这个数字本身还大 这不存在
DP[num][m]=DP[num][num];
else if(num==m) //如果最大加数等于这个数字本身时 就用DP[num][上一个数的值]+1
DP[num][m]=DP[num][num-1]+1;
else //常规情况
DP[num][m]=DP[num][m-1]+DP[num-m][m];
}
}
int num;
while(cin>>num){
cout<<DP[num][num]<<endl;
}
return 0;
}
上一篇: 结构体数组排序
下一篇: 父类对子类的引用(父类引用指向子类对象)
推荐阅读
-
HDU 1028 Ignatius and the Princess III
-
HDU 1028 Ignatius and the Princess III(生成函数)
-
HDU 1028 Ignatius and the Princess III(生成函数)
-
HDU1027-Ignatius and the Princess II(全排列问题next_permutation函数的使用)
-
HDU 1027 Ignatius and the Princess II[DFS/全排列函数next_permutation]
-
HDU 1027 Ignatius and the Princess II(全排列)
-
HDU 1027 Ignatius and the Princess II(全排列next_permutation函数)
-
【排列】HDU1027 Ignatius and the Princess II
-
HDU 1027 Ignatius and the Princess II(全排列问题)
-
HDU - 1027 Ignatius and the Princess II 全排列