摘要:
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;#define INF 0x80000000int re[15];bool dp[100006];int main(){ int t=1,i,j,k,ans; while(~scanf("%d",&re[1])) { ans=re[1]; for(i=2;i 阅读全文
摘要:
有点小坑的严格单调递增序列,主要是排序那里坑了一下。思路:矩形的嵌套? (a<c&&b<d)||(a<d&&b<c)? 不,只要在建点时保证a<b,条件就会少一个,直接a<c&&b<d就行了#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;str 阅读全文
摘要:
/*第一行:将n划分成若干正整数之和的划分数。状态转移方程:dp[i][j]:和为i、最大数不超过j的拆分数dp[i][j]可以分为两种情况:1、拆分项至少有一个j 2、拆分项一个j也没有dp[i][j]=dp[i-j][[j]+dp[i][j-1]第二行:将n划分成k个正整数之和的划分数。dp[n-k][k]:相当于把k个1从n中拿出来,然后和n-k的拆分项相加的个数第三行:将n划分成若干最大不超过k的正整数之和的划分数。dp[n][k]第四行:将n划分成若干奇正整数之和的划分数。dp1[i][j]是当前的划分数为i,最大值为j时的中的划分数,则状态转移方程为dp1[i][j]=dp1[i] 阅读全文
摘要:
个人觉得DP最烦的就是确定初始边界,比如说这题,求10^9的数内各个数位相加的和中有多少个数的数位和等于S初始条件:dp[0][j]=1 j=1、2…9状态转移方程:dp[i][j]表示:和为i,不超过j个数相加的符合条件的数有多少个dp[i][j]=sum{dp[i-k][j-1] k=0、1…9}#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namesp 阅读全文