hdi2189基础dp

来源:互联网 发布:涙は知っている 编辑:程序博客网 时间:2024/06/05 10:10
/*****************************************Author      :Crazy_AC(JamesQi)Time        :2015File Name   :思路:题意就是又不超过n个素数组合成n的情况有多少种;1 2 3 4 5 6 7 8 9 。。。可以看成是数的生成情况;就是dp[i][j]表示又不超过i的素数组合成j的情况总和;那么:1.i是素数时dp[i][j] += dp[i][j - i];2.dp[i][j] = dp[i - 1][j];*****************************************/// #pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <algorithm>#include <iomanip>#include <sstream>#include <string>#include <stack>#include <queue>#include <deque>#include <vector>#include <map>#include <set>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <limits.h>using namespace std;#define MEM(a,b) memset(a,b,sizeof a)#define pk push_backtemplate<class T> inline T Get_Max(const T&a,const T&b){return a < b?b:a;}template<class T> inline T Get_Min(const T&a,const T&b){return a < b?a:b;}typedef long long ll;typedef pair<int,int> ii;const int inf = 1 << 30;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;const int N = 200;bool prime[N + 1];int dp[N][N];inline void Init(){MEM(prime, false);// prime[1] = false;// prime[0] = true;for (int i = 2;i <= 200;++i){if (!prime[i]){for (int j = i + i;j <= N;j += i){prime[j] = true;}}}}int main(){// ios::sync_with_stdio(false);// freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);int n,T;Init();cin >> T;while(T--){cin >> n;MEM(dp, 0);dp[1][0] = 1;for (int i = 2;i <= n;++i){for (int j = 0;j <= n;++j)dp[i][j] = dp[i - 1][j];if (prime[i]) continue;for (int j = i;j <= n;++j)dp[i][j] += dp[i][j - i];}cout << dp[n][n] << '\n';}return 0;}

0 0
原创粉丝点击