- 博客(17)
- 资源 (2)
- 收藏
- 关注
原创 rnqoj-49-加分二叉树-(区域动归+记忆化)
区域动归的问题#include#include#include#includeusing namespace std;int n;int a[51];int vis[51][51];int num[51][51];int dll(int l,int r){ int i; if(num[l][r]!=-1)return num[l][r]; if(
2013-09-26 14:38:32 1063
原创 rnqoj-39-饮食问题-01背包
01简单背包#includeint dp[50001];int a[1001];int main(){ int i,j,c,b; scanf("%d%d",&c,&b); for(i=0;i<b;i++)scanf("%d",&a[i]); dp[0]=1; for(i=0;i<b;i++) { for(j=c;j>
2013-09-24 13:53:22 840
原创 rnqoj-38-串的记数-dp+大整数加法
dp过程很简单,就是加一个大整数加法。。。 #include #include #include #include using namespace std; int dp[61][61][61][101]; void jia(int a,int b,int c,int x,int y,int z) { int l
2013-09-23 15:06:53 1030
原创 rnqoj-30- [stupid]愚蠢的矿工-树形DP
把树转化为二叉树,然后再左右DP;#include#include#include#includeusing namespace std;struct list{ int l; int r;}node[2001];int val[2001];int vis[2001][101];int m,n;int dp(int x,int m){ if(
2013-09-22 15:51:14 1795
原创 rnqoj-28-合唱队形-最长上升子序列
想当年大一的时候,一个最长上升子序列的问题使得我的罚时上升了不少。。。。当年还是图样啊这道题目本质就是求最长上升子序列#include#include#include#includeusing namespace std;int main(){ int i,n,j,a[201]; cin>>n; for(i=1;i<=n;i++) {
2013-09-22 14:49:45 1554
原创 rnqoj-15-采药--压缩区间
当s==t的时候,比较容易求。当s这样dp求解就可以了#include#include#include#includeusing namespace std;int l,s,t,m,ans;int a[151];int b[151];int dp[210000];void dos(){ int i,j,k; sort(a+1,a+m+1);
2013-09-22 14:37:06 974
原创 rnqoj-6-有依赖背包
这道题目的由于每个主件最多只有2个附件,所以每一个主件和其附件可以分解成:主件主件+附件1主件+附件2主件+附件1+附件2这样每一个主件何其附件就组成了一个分组。每个分组里只能取一个(WA了多次。。。。)这样就变成了分组背包问题。for 每一个分组for v...0(背包容量)for 所有属于分组里的数dp[x]=max(dp[x],dp[x-c[i]]
2013-09-20 15:45:26 1050
原创 rnqoj-5-能量项链(记忆化搜索)
dp[i][j]代表i到j这一段的项链所含的最大聚能量dp[i][j]=max(dp[i][k]+dp[k+1][j]+num[i]*num[k+1]*num[j+1]);(i#include#include#include#includeusing namespace std;int num[501];int dp[501][501];int dos(int
2013-09-20 14:15:16 1000
原创 rnqoj-2-01背包
01背包典型题目#include#include#include#includeusing namespace std;int dp[50001];int v[31];int w[31];int main(){ int n,m,i,j; cin>>n>>m; memset(dp,0,sizeof(dp)); for(i=0;i<m;i++)
2013-09-20 12:55:02 836
原创 wikioi-1039-数的划分
将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。dp[i][j]:把数i分成k分的方案数则:dp[i][j]=sum(dp[i-j][t])(t>=1&&t#include #include#include#include using namespace std;int dp[501][21];int main(){ int n,k,
2013-09-20 12:07:54 2604
原创 poj-2057-树形dp
虽然写了很久,但是1A还是很开心的。。。。这个题目找准状态转移,然后运用部分贪心优化一下。int pos[1010];//标记当前节点是不是有虫子int snode[1010];//标记当前节点为根的子树中包含的叶子节点。int die[1010];//标记当前节点为根的子树中不含有房子的步数int win[1010];//标记当前节点为根的子树中 含有房子的步数#i
2013-09-19 20:01:34 1111
原创 poj-2411-状态压缩DP
用一个vector容器来记录当前状态下有哪些状态可以继承。比如说vec[i]里面的所有的数代表当第一行为i状态时,第二行的可行状态。对于状态i,其二进制中0的地方表示为当前状态为竖着的木板的下半部分。 其二进制中1的地方表示为当前状态为横着的木板或者竖着的木板的上半部分。#include#include#include#include#includeusing
2013-09-19 15:00:56 1013
原创 poj-3254-Corn Fields-状态压缩DP
最近看题真的脑残了。。1,结果忘记取模WA一次2,结果忘记判断可不可存在WA了多次#include#include#include#includeusing namespace std;#define MOD 100000000#define ll __int64ll dp[15][5001];int map[15][15];int main(){ in
2013-09-18 22:06:27 913
原创 hdu-4747-Mex
绝世好题啊根据题意可知,sum[1,i](表示从1到i这个区间的mex值)是随着i递增的。可以根据新加入的数来判断新加的数是多少。#include#include#include#includeusing namespace std;#define maxn 200010int a[maxn];int pre[maxn];int ss[maxn];int main
2013-09-18 15:17:37 2163 2
原创 poj-1691-暴力DFS
感觉智商变低了。。。暴力的DFS都不会做了#include#include#include#includeusing namespace std;struct list{ int x1,y1; int x2,y2; int c;}node[21];struct list2{ int ipos; int col;}po[101],p
2013-09-12 20:50:34 1195
原创 poj 3373 -记忆搜索
让人很无奈的是一开始初始化初始化的不对。。。。还是比较水的题目。。,。#include#include#include#includeusing namespace std;#define maxn 201int num[maxn],k,n;int nums[maxn];int mod[maxn][11];int vis[105][10010][10];void i
2013-09-12 19:13:31 1063
原创 poj-2777-线段树
被线段树虐死了。。。大体题意:有一块板子,上面的颜色都为1.然后给你以下操作:C A B C 把A-B染成CP A B 询问A-B有几种颜色。做法:区域更新线段树。#include#include#include#includeusing namespace std;#define maxn 100010struct list{ int a
2013-09-07 20:29:14 849
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人