摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602题目很简单,值得一提的是:如果要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1505思路:完全就是hdu 1506的加强版,只要取定第i行,这样就可以用1506的方法来做了,最后加个for循环就行了;View Code 1 #include<iostream> 2 #include<algorithm> 3 const int N=1100; 4 using namespace std; 5 int l[N][N],r[N][N],h[N][N]; 6 char map[N][N]; 7 8 int main(){ 9 int _case;10 sca 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506大意:求一个最大的区域,则第i个矩形对应的面积是ave[i] = (r[i] - l[i] + 1) * a[i];l[i]表示以它这个高度所能到达的最左边的位置(最左一个高度不小于它的高度的位置),而r[i]表示能到达的最右边的位置(最右一个高度不小于它的高度的位置)。这道题实际上就是对于任意数x求大于等于x的最左数的下标和最右数的下标;直接进行迭代就行;View Code 1 #include<iostream> 2 #include<algorithm> 3 co 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231dp水题;View Code 1 #include<iostream> 2 #include<cstring> 3 const int N=11000; 4 using namespace std; 5 int a[N],dp[N]; 6 7 int main(){ 8 int n; 9 while(scanf("%d",&n)!=EOF&&n){10 memset(dp,0,sizeof(dp));11 memset(a,0 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864大意:对于每张发票,要么报销,要么不报销,0-1背包,张数即为背包;转移方程:f[j]=max(f[j],f[j-1]+v[i]);一开始边界没考虑,导致输出结果为0.00;View Code 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 double price[1000]; 6 double dp[1000]; 7 8 int 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555题目大意是让你求出[1,n]中多少个数包含49;1.dp[len][0]代表数字长度为len不含49的个数2.dp[len][1]代表数字长度为len不含49但是以9开头的个数(显然dp[len][1]包含在dp[len][0]中)3.dp[len][2]代表数字长度为len含有49的个数View Code 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 __int64 dp[22][3 阅读全文