DP(动态规划)
他们叫我无极
普普通通,简简单单,真真切切,实实在在。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
HDU 3496 - Watch The Movie
知识点:二维背包 #include #include int dp[101][1001],m,l; inline int max(int a,int b) { return a>b ? a : b; } void PlanarPack(int val,int ti,int temp) { if(ti<=l) { for(int i=m=1;i原创 2011-11-10 12:37:37 · 403 阅读 · 0 评论 -
HDU 2955 - Robberies
知识点:01背包的概率问题 当前的概率基于前一种状态的概率,即偷n家银行而不被抓的概率等于偷n-1家银行不被抓的概率乘以偷第n家银行不被抓的概率。 用dp[i]表示偷价值为i时不被抓的概率,则状态转移方程为:dp[i]=max(dp[i],dp[i-m]*(1-p))。 #include #include double dp[10001]; int sum; inline doubl原创 2011-11-10 12:35:05 · 449 阅读 · 0 评论 -
HDU 1503 - Advanced Fruits
知识点:最长公共子序列(LCS) dp[i][j]记录到a的第i个字符和b的第j个字符为止公共子序列的长度;path[i][j]记录公共子序列的走向;member[i]保存最长公共子序列的成员。 #include #include int main() { char a[101],b[101],member[101]; int dp[101][原创 2011-11-10 12:14:47 · 331 阅读 · 0 评论 -
HDU 1009 - FatMouse' Trade
知识点:贪心算法 最简单的贪心:优先选择性价比高的。 #include #include struct Cat { int J; int F; double per; //性价比 }; inline int cmp(const void *a,const void *b) { return ((Cat *)b)->per>((Cat *)a)->p原创 2011-11-10 12:09:18 · 337 阅读 · 0 评论 -
HDU 1160 - FatMouse's Speed
知识点:最长有序(上升)子序列 #include #include struct Mouse { int weight; int speed; int num; //记录当前老鼠排序前的序号 int last; //记录为当前dp提供更新的前一个老鼠排序后的序号 }mouse[1000]; //结构体一级排序,按weight从小到大 inlin原创 2011-11-10 11:59:45 · 360 阅读 · 0 评论 -
HDU 2037 - 今年暑假不AC
知识点:贪心 + 结构体一级排序 #include #include struct TV { int Ti_s; int Ti_e; }; inline int cmp(const void *a,const void *b) { return ((TV *)a)->Ti_e-((TV *)b)->Ti_e; } int main() { int n;原创 2011-11-10 11:36:08 · 315 阅读 · 0 评论 -
HDU 1003 - Max Sum
知识点:最大连续子序列和 哇哈哈,一不小心刷到前10名去了,偷笑ING…… #include bool scan_d(int &n) //整数输入外挂,减少时间 { char i; bool I=0; i=getchar(); if(i==EOF) return 0; while(i!='-'&&(i'9')) i=getchar();原创 2011-11-10 11:07:58 · 241 阅读 · 0 评论 -
HDU 2844 - Coins
知识点:多重背包 多重背包由01背包和完全背包构成,有了01和完全的基础,多重还是挺好理解的。 #include #include bool dp[100001]; int V; void ZeroPack(int val) { for(int v=V;v>=val;v--) if(dp[v-val]) dp[v]=1; } void CompletePack(i原创 2011-11-10 10:53:55 · 296 阅读 · 0 评论 -
HDU 1248 - 寒冰王座
知识点:完全背包 背包总体上有两种使用方法: 1、当物品的价值和体积不等时,用dp[ ]表示价值。 2、当物品的价值和体积相等时,用dp[ ]表示状态。例如本题中,dp[i]==0表示无法达到价值i;dp[i]==1表示可以达到价值i。其它的背包也有这种性质。 #include #include bool dp[10001]; int V; void ComplatePack(原创 2011-11-10 11:45:07 · 374 阅读 · 0 评论 -
HDU 1176 - 免费馅饼
知识点:1、数塔; 2、整数(int 型)输入外挂(可大大缩短数据输入的时间,对于数据庞大的题目效果显著)。 #include #include //整数输入外挂,减少时间 bool scan_d(int &n) { char i; bool I=0; i=getchar(); if(i==EOF) return 0原创 2011-11-10 12:19:16 · 310 阅读 · 0 评论 -
HDU 2059 - 龟兔赛跑
知识点:DP #include int main() { int l; while(scanf("%d",&l)!=EOF) { int n,c,t,vr,v1,v2; scanf("%d%d%d%d%d%d",&n,&c,&t,&vr,&v1,&v2); double dp[102]; //dp[i]表示从出发点原创 2011-11-10 11:30:36 · 356 阅读 · 0 评论 -
HDU 2602 - Bone Collector
知识点:01背包 01背包是基础,一定要把01背包真正搞懂,那其它的背包就容易懂了。 #include #include int dp[1001],V; inline int max(int a,int b) { return a>b ? a : b; } void ZeroOnePack(int val,int vol) { for(int v=V;v>=vol原创 2011-11-10 12:26:57 · 295 阅读 · 0 评论 -
HDU 2159 - FATE
知识点:二维背包 只是在一维的基础上加一维,其它的都一样。 #include #include int dp[100][100],m,s; inline int max(int a,int b) { return a>b ? a : b; } void PlanarPack(int a,int b) { for(int i=b;i<=m;i++) for(原创 2011-11-10 11:19:14 · 289 阅读 · 0 评论 -
HDU 1085 - Holding Bin-Laden Captive!
知识点:母函数 母函数类似背包,也有两种使用方法: 1、用 f1、f2 存储放法数; 2、用 f1、f2 存储状态。 例如本题中:f1[i]==1 表示 i 值可以达到,f1[i]==0 表示 i 无法达到。 #include int main() { int num_1,num_2,num_5; while(scanf("%d%d%d",&n原创 2011-11-10 10:35:25 · 291 阅读 · 0 评论
分享