摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4393思路:考虑Si最大只有100,所以我们可以建立优先队列数组s[1..100],对于每个优先队列,按第一关键字Fi第二关键字ID排序,每次取出所有的优先队列里最大值,然后直接 计算(Time-1)*Si + Fi 找最大的way,将对应的优先队列pop并输出对应ID即可。View Code 1 #include<iostream> 2 #include<queue> 3 const int N=110; 4 using namespace std; 5 6 struct 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4022STL应用,一开始用multimap写的,然后实现不了,于是就看了别人用map自定义了一个一对多。。。orz。。。剩下的就简单了。。分别用两个这样的map容器装下 x为键,y为值,和y为键,x为值的两个容器。 然后当C==0就输出当键位d的容器大小,并且去掉另一个容器中出现的点。同理C==1一样。View Code 1 #include<iostream> 2 #include<map> 3 #include<set> 4 const int N=10001 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024学习了一下滚动数组,dp中经常卡内存,而利用滚动数组可以大大节省内存空间,不错哦。View Code 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 const int N=1000010; 5 const int inf=1000000000; 6 using namespace std; 7 8 int a[N]; 9 int dp[N],pre[N];//dp[i][j] 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114思路:在背包九讲中有提到,如果是要恰好装满,那么这儿dp[]的初始化时应将dp[0]=0,由于这儿是求最小值,故应将dp[1]-dp[n]置为正无穷;若是求最大值,则置为负无穷;View Code 1 #include<iostream> 2 const int N=550; 3 const int inf=1000000000; 4 using namespace std; 5 6 struct Node{ 7 int value,weight; 8 }node[N]; 9 in 阅读全文
摘要:
题目链接: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 / 阅读全文