博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3186(区间DP)
阅读量:5902 次
发布时间:2019-06-19

本文共 916 字,大约阅读时间需要 3 分钟。

题目链接:http://poj.org/problem?id=3186

思路:

区间DP,给treat编号为1..n,状态很明显是上界i和下界j,dp[i][j]表示从下标i到下标j之间数据的最大价值。可以正向转移,从dp[1][0]开始,也可以逆向转移,从dp[i][i]开始。我这里是正向转移,状态转移方程如下:

       if(i>1&&j<n)

                dp[i][j]=max(dp[i-1][j]+(n-1-(j-i))*a[i-1],dp[i][j+1]+(n-1-(j-i))*a[j+1]);
            if(i>1&&j==n)
                dp[i][j]=dp[i-1][j]+(n-1-(j-i))*a[i-1];
            if(i==1&&j<n)
                dp[i][j]=dp[i][j+1]+(n-1-(j-i))*a[j+1];
其中的(n-1-(j-i))是age。但循环结束后的dp[i][i]并不是最终结果,还需加上n×a[i]。

代码如下:

1 #include
2 #include
3 using namespace std; 4 5 int n,res; 6 int a[2005],dp[2005][2005]; 7 8 int main(){ 9 scanf("%d",&n);10 for(int i=1;i<=n;++i)11 scanf("%d",&a[i]);12 dp[1][n]=0;13 for(int i=1;i<=n;++i)14 for(int j=n;j>=i;--j){15 if(i>1&&j
1&&j==n)18 dp[i][j]=dp[i-1][j]+(n-1-(j-i))*a[i-1];19 if(i==1&&j

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10427004.html

你可能感兴趣的文章
java的深拷贝与浅拷贝
查看>>
程序员如何提高工作效率
查看>>
promise
查看>>
将Java应用部署到SAP云平台neo环境的两种方式
查看>>
数据批量导入Oracle数据库
查看>>
调用lumisoft组件发邮件 不需要身份验证 不需要密码
查看>>
DW 正则
查看>>
抓屏原理
查看>>
UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出
查看>>
扩展 DbUtility (1)
查看>>
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
查看>>
Apple Developer Registration and DUNS Number Not Accepted
查看>>
Hadoop学习笔记系列文章导航
查看>>
SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题
查看>>
Prometheus : 入门
查看>>
使用 PowerShell 创建和修改 ExpressRoute 线路
查看>>
PHP如何学习?
查看>>
在C#中获取如PHP函数time()一样的时间戳
查看>>
Redis List数据类型
查看>>
大数据项目实践(四)——之Hive配置
查看>>