不容易的系列之一
题目大意:1~n个信封,1~n封信,求全部装错的情况数
思路:F[1]=0,F[2]=1,n>=3时假设信n装入信封k,信m装入信封n,考虑两种情况:1)m=k,此时仅需一次对换则n,k都装对,剩余n-2个全部装错,由于k<=n-1,有n-1中取法,所以为(n-1)*F[n-2]。2)m<>k,此时将信m和信n对换则信n装入信封n,信封m装信k,剩余n-1全部装错,(n-1)*F[n-1]
状态转移方程:F[n]=(n-1)*F[n-1]+(n-1)*F[n-2](错排公式)
搬寝室
题目大意:在n个物品中选2*k个搬走,每次搬运疲劳度为二者重量差的平方,求最小疲劳度
思路:可证配对情况必为重量最大的与次大的为一对,最小的与次小的为一对。则可先对a[]排序。dp[i][j]表示到1~j中选取了i对搬运,则有两种情况,a[j-1]已配对;a[j-1]未配对
初始化:dp[0][j]=0,注意 j<=2*i时dp[i][j]要初始化为INF,即j-1和j必须配对状态转移方程:dp[i][j]=min{ dp[i][j-1] , dp[i-1][j-2]+(a[j]-a[j-1])^2 }
4982:踩方格
题目大意:无限矩阵,只能向北、东、西三个方向走,不允许走回头路,问n步内有多少条路径数
设向西、北、东三个方向走的方案数为l,r,uu(i)=l(i-1)+r(i-1)+u(i-1)=f(i-1)
则f(i)=l(i)+u(i)+u(i)=2f(i-1)+u(i-1)=2f(i-1)+f(i-2)
Greedy Tino
题目大意:一堆重量0~2000的柑橘,要求取出两堆放在扁担两头且重量相等,求符合条件的最大重量
思路:dp[i][j]表示遍历到i堆时第1堆比第二堆重j,初始dp[0][0]=0,结果为dp[n][0]/2。此外需要判断是否存在重量为0的柑橘,若存在则结果为0(两堆重量为0的柑橘),否则为-1(没有这样的分堆方式)
状态转移:dp[i][j]=max(dp[i-1][j-a[i]]+a[i],dp[i-1][j+a[i]]+a[i],dp[i-1][j])
原题
题目大意:一堆人分成两拨,体重差最小
思路:在不超过1/2总体重的情况下求最大体重值,01背包问题
一下题目均能套模板,不再概述:
8462 大盗阿福 :dp[i]=max(dp[i-2],dp[i-3])+a[i]
8467 鸣人的影分身:n分为k个数
6252 带通配符的字符串匹配
2728 摘花生
4978 宠物小精灵之收服
6045 开餐馆(重复)
8785 装箱问题
8787 数的划分(和复杂的整数划分重)
666 放苹果:N划分为1、2、...、m个整数