Uva Dynamic Programming
jsgxq
有点小梦想
展开
-
11258 - String Partition
/* 刚开始用d[i][j]表示从i到j的最大和,O(n^3)勉强过了。 去网上找题解才知道可以只用d[i]表示1到i个数字的最大和,O(n^2)果然很快 */ #include #include #define ll long long #define maxn 205 #define inf (1<<31)-1 ll d[maxn][maxn]; int len; char s[原创 2012-08-02 14:05:17 · 574 阅读 · 0 评论 -
11008 - Antimatter Ray Clearcutting
/* 自己没思路,去网上看了大牛的题解才会的,竟然是2进制状态压缩啊,感觉也不难就是自己 想不出来,之前还有一题是10911 - Forming Quiz Teams 也是2进制状态压缩,像这种 数据量不大于30,状态转移和每个元素都可能有关系的DP应该都是用状态压缩吧。 DP每次最关键的是找两棵没被砍的树然后找到这两棵树所在直线的所有没被砍的树,然后砍掉进入下一状态。 */ #include原创 2012-07-31 11:18:07 · 730 阅读 · 0 评论 -
10913 - Walking on a Grid
1 2 3 5 4 1 2 3 /* 这题要开4维数组,如果你只开3维数组请看上面的那两个表格,12345代表走的路。 如果开3维的他们的表示有可能是相同的,因为负数的原因也可能不原创 2012-07-30 15:59:50 · 627 阅读 · 0 评论 -
662 - Fast Food
/* 首先预处理用w[i][j]表示从i到j的最小距离和 用d[i][j]表示用在前i个饭店中选j个仓库的最小距离和 状态转移方程d[i][j]=min(d[k][j-1]+w[k+1][i]) k:1->i-1; 然后递归打印路径,如果用非递归的话要记录一下。 */ #include #include #define maxn 205 int r[maxn],d[maxn][35],w[原创 2012-07-28 23:14:12 · 464 阅读 · 0 评论 -
607 - Scheduling Lectures
/* wa了无数次/(ㄒoㄒ)/~~,最后才发现当c=1的时候我的程序有问题,因为当某种方法不合要求时我的 返回值是-1,c=1时当时间差在10以内返回值也是-1,然后就妥妥的悲剧了。 最后把不合要求的返回值改成(1/*首先贪心找最小的课程数ln(因为每个话题必须按先后顺序选)。 然后dp找最小的不满意度。 d[i][j]表示从第i个话题开始选组合成j个课程个的最小不满意度 状态转移方程:d[i]原创 2012-07-29 20:52:51 · 515 阅读 · 0 评论 -
10626 - Buying Coke
/* 这题很水,但是不好想。 直接开4维数组会超内存,用一个三维数组+变量传递来代替四维数组。 d[i][j][k]代表用i个面值为1的硬币j个面值为5的硬币和k个面值为10的硬币买coke个可乐 所用的最少硬币,状态转移方程有好几个就不写了,详情见代码。 还有提醒一下 输入 2 8 0 1 结果是 8 因为10+3*1=coke*1+5;(coke代表一瓶可乐) 如果你的程序没有考虑这个情况原创 2012-07-29 13:33:33 · 655 阅读 · 0 评论 -
10911 - Forming Quiz Teams
/* 这题的状态用普通方法不好表示,可以用状态压缩后的一维数组来表示, d[i]表示当前配对状态为i时的最短距离和。其中i用2进制表示后第k位如果是0则代表 第k位同学已经组队,1代表第k位同学还未组队。 状态转移方程:d[a]=min(d[a],dp(a^(1<<i)^(1<<j))+distance(i,j)); ^是异或运算,1^0=1,0^0=0;1^1=0; dp(a^(1<<i)^(原创 2012-07-26 22:10:25 · 619 阅读 · 0 评论 -
10817 - Headmaster's Headache
/* d[i][j]表示到第i个老师,授课状态是j时的最小花费。 用16个2进制1即 (1<<16)-1 代表所有的课程都有两个老师授课。 状态转移方程 d[i][j]=min(d[i][j],min(dp(i-1,j),dp(i-1,temp)+cost[i])); temp代表在当前授课情况上加上当前老师能教的课程后的授课情况。 */ #include #include #defin原创 2012-08-03 14:23:50 · 975 阅读 · 0 评论 -
10723 - Cyborg Genes
#include #include #define LL long long #define maxn 35 LL d[maxn][maxn][maxn],fd[maxn][maxn],ls1,ls2; char s1[maxn],s2[maxn]; LL max(LL a,LL b) { if(a>b) return a; else return b; } LL dp(int l1,in原创 2012-08-02 08:58:59 · 566 阅读 · 0 评论