- 博客(8)
- 收藏
- 关注
原创 uva 10304 - Optimal Binary Search Tree(区间dp)
题意: 建一棵树,左子树小于根小于右子数,现要求求出f1*h1+f2*h2+...的最小(f是权值,h是高度) 那么用区间dp,枚举i到j以k为根的最小总数 那么每增加一层(除了根),就会增加sum:i->j并且减去a[k]; #include #include #include #include using namespace std; const int maxn = 26
2016-04-18 19:48:18 269
原创 uva10123
题意: 给出板的长度重量和n个物块,给出每个物块的位置以及重量,求使木板保持平衡的取法 思路: 两个支点对木板有一个向上的力,放在上面的木板有向下的力,一旦向上的力不敌向下的力,木板就会失去平衡(物理不好,不知道是不是) lef装者左边的合力,rig装者右边的合力,那么用压缩状态和记忆化搜索来做 st表示的是板上有几个物块,每当一个取法合理,就更新状态传进去#include #inclu
2016-04-18 16:25:04 268
原创 Tour uvalive3305
题意: 给出n个点,要求飞行员严格从1点出发至最右点(只能往右),再严格往左回到1 思路: 由于是闭合的,所以n与n-1一定是相连的,那么一定有总路劲是dp[n][n-1]+a[n][n-1],dp[n][n-1]表示从n走到1在从1走到n-1,从而构成环 i与i-1有可能是一侧也有可能是两侧,在枚举i-1之前的点j: 如果一侧,那么有dp[i][j]=dp[i-1][j]+a[i][i
2016-04-10 15:52:55 238
原创 Bigger is Better
题意: 用n根火柴棒搭出数字,求这个数能被m整除的最大值 思路: 递推的式子是newi=i+num[k][根数], newj=(j*10+k)%m[余数] dp[newi][newj] = max(dp[i][j]+1, dp[newi][newj]); 那么ans是只针对余数为0的情况 出发点是dp[0][0],结尾点是dp[i][0],之间必定是会得出一条等差数列(d=1)铺成
2016-04-07 21:34:19 394
原创 UVALive - 4614 Moving to Nuremberg (树形DP)
题意: 找出一个点,使得从这个点出发经过规定点规定次数路径总和最短 思路: 首先先建树,设1为根,并计算从1出发的总路径 那么从父结点递推下去算其字节点有: dp[v] = dp[u]+(sum-f[v])*len*2-f[v]*len*2 式子的意思就是v以上的点(-f[v])要多走u->v, 然后呢由于dp[u]里面含有v以下的点v->u的路径,所以减去 代码: #include
2016-04-06 18:35:36 201
原创 uva10131
题意: 求大象从重量递增且智商递减的序列的最长,并打印最长序列 思路: dp[cur]表示以cur为结尾的最长,很好理解 code: #include #include const int N = 10005; struct state { int w, s; }tmp[N]; int n, dp[N], vis[N]; int find(int cur) { if(dp[cur]
2016-04-04 12:05:19 266
原创 uva116
题意: 从左往右走,使得得到的行数的字典集尽量小,且得到的总和最小 思路: 逆向dp保证字典集尽量小 代码:#include #include #include #include using namespace std; int m, n; int maps[11][101]; int smap[11][101]; int fath[11][101]; int main() { whil
2016-04-04 11:42:09 346
原创 uva10614
题意: 给*的位置涂色,保证不同行不同列的涂色不同 思路: 关键思路我已经标在代码上了 一共要涂k种颜色,那么就要选出k条完全匹配的路(这样理解, 一旦这个点的横纵坐标相连,那么这两座标将不再参与匹配,即不能有相同行相同列的点) 代码: #include #include #include #include #include using namespace std; #define r
2016-04-04 00:22:36 266
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人