摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191这完全就是多重背包的应用啊,刚看了背包九讲。。。orz,直接按着上面的伪代码敲的。。。View Code 1 #include<iostream> 2 const int N=110; 3 using namespace std; 4 int n,m; 5 6 struct Rice{ 7 int price; 8 int weight; 9 int number;10 }rice[N];11 int dp[N];12 //完全背包13 void CompleteP... 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2845思路:对于一行来说,相邻的数不可同时取,容易得到状态转移方程:sum[i] = max (sum[i-2]+sum[i], sum[i-1]),其中sum[i]表示一行前i个数时的最大和;然后把sum[m]保存到另一个数组中,对于每一行都这么做,然后最后在对数组再次进行一边这样的操作就行了;View Code 1 #include<iostream> 2 const int N=200020; 3 using namespace std; 4 5 int a[N],b[N]; 6 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421状态转移方程有点困难。。。orz,得练那。。。View Code 1 /* 2 题目大意: 3 给定n个物品,每个物品有重量, 4 从中选出m对,使得这m对物品重量差的平方和最小。 5 疲劳度:m对物品重量差的平方和 6 分析与解题思路 7 先对n中物品的重量排序 8 令dp[i][j]表示前i个物品中选j对的最小疲劳度。 9 则dp[i][j]可能含有第i个物品(这种情况下,第i种物品一定是和第i-1个物品配对),10 则dp[i][j]=dp[i-2][j-1]+(w[i]-w[i-1]. 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257思路:其实,仔细一想,该序列的最长递增子序列即为至少要多少套导弹拦截系统;dp[i]表示拦截第i个导弹时的最长递增子序列的长度;View Code 1 #include<iostream> 2 #include<algorithm> 3 const int N=1010; 4 using namespace std; 5 6 int h[N]; 7 int dp[N]; 8 9 int main(){10 int n;11 while(scanf("%d&qu 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159思路:dp[i][j]表示s1从0~i-1,s2从0~j-1的最长公共子序列;递推方程为:dp[i][j]=(s1[i-1]==s2[j-1])?d[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]);View Code 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 const int N=1010; 5 using namespace std; 6 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844思路:其实就是多重背包的应用,只是这里价值和重量是相等的,因此最后计数是要计价值和重量相等的个数;View Code 1 #include<iostream> 2 #include<algorithm> 3 const int N=100010; 4 using namespace std; 5 int n,m; 6 7 struct Node{ 8 int value; 9 int number;10 }node[N/100];11 int dp[N];12 13 / 阅读全文