Mark一下, dp状态转移方程写对,可是写代码都错,poj 1651 poj 1179
dp题:
1、写状态转移方程;
2、考虑初始化边界,有意义的赋定值。还没计算的赋边界值;
3、怎么写代码自底向上计算最优值
今天做了几个基础dp,所有是dp方程写对可是初始化以及计算写错
先是poj 1651 事实上就是个赤裸裸的矩阵连乘。dp方程非常easy写出
dp[i][j]=min(dp[i][k]+dp[k+1][j]+r[i]*c[k]*c[j],dp[i][j]);
先贴两个个二逼的代码,mark下自己多么的二逼:
二逼一:在计算的时候使用了还没有算出来的值,模拟下就知道第一重循环里算dp[0][2]=dp[0][0]+dp[1][2];
!!!!!dp[1][2]这时候根本没有计算出来还,Tmd我就用了这个值!!
!
。!!!!
!。!
。!
!。!
。。!。。!
!
二逼啊!
!!!
!。。!
!
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int SIZE = 100+10;
const int INF = 10000000;
int dp[SIZE][SIZE];
int r[SIZE],c[SIZE]; int main()
{
int n;
while(~scanf("%d",&n))
{ for(int i=0;i<n-1;i++)
{
scanf("%d",&r[i]);
if(i>0)c[i-1]=r[i];
}
scanf("%d",&c[n-2]);
n--;
int ans=0;
for(int i=0;i<n;i++)dp[i][i]=0; for(int i=0;i<=n;i++)
for(int j=i;j<n;j++)
{ for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][k]+dp[k+1][j]+r[i]*c[k]*c[j],dp[i][j]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%d ",dp[i][j]);
putchar('\n');
} printf("%d\n",dp[0][n-1]); }
return 0;
}
二逼二:来回换思路的时候各种思路弄混。看凝视
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int SIZE = 100+10;
const int INF = 10000000;
int dp[SIZE][SIZE];
int r[SIZE],c[SIZE]; int main()
{
int n;
while(~scanf("%d",&n))
{ for(int i=0;i<n-1;i++)
{
scanf("%d",&r[i]);
if(i>0)c[i-1]=r[i];
}
scanf("%d",&c[n-2]);
n--;
int ans=0;
for(int i=0;i<n;i++)dp[i][i]=0;
int j;
for(int l=2;l<=n;l++)
for(int i=0;i<l;i++)//此处i<l及其傻逼,请勿模仿
{
j=i+l-1;
dp[i][j]=INF;
for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][k]+dp[k+1][j]+r[i]*c[k]*c[j],dp[i][j]);
}
/*for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%d ",dp[i][j]);
putchar('\n');
}*/ printf("%d\n",dp[0][n-1]); }
return 0;
}
正确代码:
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
#define ll long long
const int SIZE = 100+10;
const int INF = 200000000;
ll dp[SIZE][SIZE];
int r[SIZE],c[SIZE]; int main()
{
int n;
while(~scanf("%d",&n))
{ for(int i=0;i<n-1;i++)
{
scanf("%d",&r[i]);
if(i>0)c[i-1]=r[i];
}
scanf("%d",&c[n-2]);
n--;
int ans=0;
for(int i=0;i<=n;i++)dp[i][i]=0;
int j;
for(int l=2;l<=n;l++)
for(int i=0;i<n-l+1;i++)
{
j=i+l-1;
dp[i][j]=INF;
for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][k]+dp[k+1][j]+r[i]*c[k]*c[j],dp[i][j]);
}
printf("%lld\n",dp[0][n-1]); }
return 0;
}
在做这个poj 1651之前 先做的poj 1179,然后过了poj 1651之后改了poj1179原来的循环次序,事实上就是类比这个poj1651,第一重循环弄成长度就可以
注意 负数乘以负数是正数 考虑最大最小值得时候一定注意
只是又一次检查下发现代码在初始化的时候冗余,精简了下。
贴代码:
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
#define ll long long const int SIZE =55;
const int INF = (-2147483647 ) ; ll dp[SIZE][SIZE],dpmin[SIZE][SIZE];
int pos[SIZE];
bool op[SIZE]; int main()
{
//freopen("poj1179.txt","r",stdin);
int n;
ll tmp1,tmp2;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)dp[i][0]=dpmin[i][0]=0;
for(int i=0;i<n;i++)
{
scanf(" %c %lld",&op[i],&dp[i][1]);
dpmin[i][1]=dp[i][1];
}
for(int j=1;j<=n;j++)
for(int i=0;i<n;i++)
{
if(j>1)dp[i][j]=INF,dpmin[i][j]=-INF;
for(int k=1;k<j;k++)
{
if(op[(i+k)%n ] == 't')
{
dp[i%n][j]=max(dp[i%n][k]+dp[(i+k)%n ][j-k],dp[i%n][j]);
dpmin[i%n][j]=min(dpmin[i%n][k]+dpmin[(i+k)%n ][j-k], dpmin[i%n][j]);
} else
{
tmp1=max(dp[i%n][k]*dp[(i+k)%n ][j-k],dpmin[i%n][k]*dpmin[(i+k)%n ][j-k]);
tmp2=max(dp[i%n][k]*dpmin[(i+k)%n ][j-k], dpmin[i%n][k]*dp[(i+k)%n ][j-k]);
tmp1=max(tmp1,tmp2);
dp[i%n][j]=max(tmp1,dp[i%n][j]);
tmp2=min(dp[i%n][k]*dp[(i+k)%n ][j-k],dpmin[i%n][k]*dpmin[(i+k)%n ][j-k]);
tmp1=min(dp[i%n][k]*dpmin[(i+k)%n ][j-k], dpmin[i%n][k]*dp[(i+k)%n ][j-k]);
tmp2=min(tmp1,tmp2);
dpmin[i%n][j]=min(dpmin[i%n][j],tmp2);
} }
}
int cnt=0;
ll ans=INF;
for(int i=0;i<n;i++)//開始的时候,这里i<=n。于是初始化的时候必须优dp[n][...]=INF,才干AC,奇怪的是计算过程中第一个下标我都%n了,最后才看到这里的问题
{
ans=max(ans,dp[i][n]);
}
for(int i=0;i<n;i++)
if(ans == dp[i][n])
pos[cnt++]=i+1; printf("%lld\n",ans);
for(int i=0;i<cnt;i++)
if(i == cnt-1)printf("%d\n",pos[i]);
else printf("%d ",pos[i]);
} return 0;
}
Mark一下, dp状态转移方程写对,可是写代码都错,poj 1651 poj 1179的更多相关文章
- poj2385 Apple Catching(dp状态转移方程推导)
https://vjudge.net/problem/POJ-2385 猛刷简单dp的第一天的第一题. 状态:dp[i][j]表示第i秒移动j次所得的最大苹果数.关键要想到移动j次,根据j的奇偶判断人 ...
- DP 状态 DP 转移方程 动态规划解题思路
如何学好动态规划(2) 原创 Gene_Liu LeetCode力扣 今天 算法萌新如何学好动态规划(1) https://mp.weixin.qq.com/s/rhyUb7d8IL8UW1IosoE ...
- hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)
HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包 ...
- 【转载】 HDU 动态规划46题【只提供思路与状态转移方程】
1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数) ...
- dp状态压缩
dp状态压缩 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了.难点在于以下几个方面:状 ...
- 1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)
根据最近做的几道树形dp题总结一下规律.(从这篇往前到洛谷 P1352 ) 这几道题都是在一颗树上,然后要让整棵树的节点或边 满足一种状态.然后点可以影响到相邻点的这种状态 然后求最小次数 那么要从两 ...
- Codeforces 889E - Mod Mod Mod(dp+状态设计)
Codeforces 题目传送门 & 洛谷题目传送门 题目名称 hopping 我们记 \(x_i=X\bmod a_1\bmod a_2\bmod\dots\bmod a_i\),也就是 \ ...
- HDU 4628 Pieces(DP + 状态压缩)
Pieces 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 题目大意:给定一个字符串s,如果子序列中有回文,可以一步删除掉它,求把整个序列删除 ...
- P2157 [SDOI2009]学校食堂 (dp+状态压缩)
题目链接:传送门 题目: 题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人 ...
随机推荐
- 习题:最短路计数(SPFA最短路计数)
最短路计数(洛谷1144)题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条.输入输出格式输入格式:输入第一行包含2个正整数N,M,为图的顶点数 ...
- button的默认type居然是submit
今天使用了html中的button标签,用js写了一点代码来完成onclick实践,当我点下它的时候,它不仅执行了我写的function,还把表单给提交了,一查它的button居然是sumbit. 然 ...
- elasticsearch备份与恢复4_使用ES-Hadoop将ES中的索引数据写入HDFS中
背景知识见链接:elasticsearch备份与恢复3_使用ES-Hadoop将HDFS数据写入Elasticsearch中 项目参考<Elasticsearch集成Hadoop最佳实践> ...
- 排列计数(permutation)
排列计数(permutation) 题目描述 求有多少种长度为n的序列A,满足以下条件: 1) 1~n这n个数在序列中各出现了一次 2) 若第i个数A[i]的值为i,则称i是稳定的.序列恰好有m个数是 ...
- java 后台封装json数据学习总结(二)
一.JSONArray的应用 从json数组中得到相应java数组,如果要获取java数组中的元素,只需要遍历该数组. /* * 从json数组中得到相应java数组 * JSONArray下的toA ...
- envsetup.sh 与 choosecombo
choose: 来定义编译选项, choosecombo 将会一步一步提示你输入相应的编译参数 https://blog.csdn.net/kickxxx/article/details/692518 ...
- javaScript 笔记(6) --- jQuery(下)
目录 --- jQuery HTML --- jQuery 遍历 --- jQuery Ajax jQuery HTML: jQuery 捕获:三个简单实用的用于 DOM 操作的 jQuery 方法: ...
- 问题:viewController不会调用dealloc()不会销毁
问题 在调试程序时,我从ViewController A push进 ViewController B,在从B back时发现程序不会执行B里面的dealloc(),很诡异的问题,因为按理说此时点击b ...
- JSTL获取Session的ID与获取文件的真实路径与项目名称
今天在测试集群配置的时候想到session共享,因此想要获取sessionID,可以通过下面方法: ${pageContext.session.id} 获取文件的真实路径: <%=request ...
- Python 多核 多线程 调度
参考: http://www.oschina.net/translate/pythons-hardest-problem https://news.ycombinator.com/item?id=58 ...