poj3186
2016-07-20 20:52
417 查看
题目传送门
简单区间dp;
本人代码:
看了邝斌大大的代码感觉加深了对区间dp的理解:
此处的dp[i][j]表示的是第(n-(j-i))+1次(可直接计算出来)取范围在i-j的最大值。
简单区间dp;
本人代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=2000+5; int d[maxn][maxn],a[maxn]; int dp(int i,int j,int k); int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(d,0,sizeof(d)); int ans=dp(1,n,1); printf("%d\n",ans); } int dp(int i,int j,int k) { if(d[i][j]>0) return d[i][j]; int& ans=d[i][j]; if(i==j) return ans=a[i]*k; else return ans=max(dp(i+1,j,k+1)+a[i]*k,dp(i,j-1,k+1)+a[j]*k); }
看了邝斌大大的代码感觉加深了对区间dp的理解:
此处的dp[i][j]表示的是第(n-(j-i))+1次(可直接计算出来)取范围在i-j的最大值。
/* POJ 3186 */ #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; const int MAXN=2020; int a[MAXN]; int dp[MAXN][MAXN]; int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) //初始化,表示在最后一次取a[i] dp[i][i]=a[i]*n; for(int k=1;k<n;k++) //**此处直接用k记录第几次取** for(int i=1;i+k<=n;i++) { int j=i+k; dp[i][j]=max(dp[i+1][j]+(n-k)*a[i],dp[i][j-1]+(n-k)*a[j]); } printf("%d\n",dp[1] ); } return 0; }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题