Wa的版本。。。
/*
DP
dp[i][j]:前i个取某些个且cost不超过j得到的最大价值
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<math.h>
using namespace std;
typedef long long int64;
//typedef __int64 int64;
typedef pair<int64,int64> PII;
#define MP(a,b) make_pair((a),(b))
const int maxn = 105;
const int maxm = 10005;
const int inf = 99999099;
const double pi=acos(-1.0);
const double eps = 1e-8;
struct Node{
int len;
bool Choosed;
int maxVal;
}dp[ maxn ][ maxm ];
void init(){
for( int i=0;i<maxn;i++ ){
for( int j=0;j<maxm;j++ ){
dp[i][j].maxVal = 0;
dp[i][j].len = 0;
dp[i][j].Choosed = false;
}
}
}
int cost[ maxn ];
int main(){
int T;
scanf("%d",&T);
while( T-- ){
int n,sum;
scanf("%d%d",&n,&sum);
//memset( dp,0,sizeof( dp ) );
init();
int SumCost = 0;
int MinCost = inf;
for( int i=0;i<n;i++ ){
scanf("%d",&cost[i]);
SumCost += cost[ i ];
MinCost = min( MinCost,cost[i] );
}
if( MinCost>sum ) {
printf("0\n");
continue;
}
if( MinCost==sum ) {
printf("1\n");
continue;
}
if( sum>=SumCost ){
printf("%d\n",n*n);
continue;
}
int ans = 0;
for( int i=0;i<n;i++ ){
for( int j=cost[i];j<=sum;j++ ){
dp[ i ][ j ].maxVal = 1;
dp[ i ][ j ].len = 1;
dp[ i ][ j ].Choosed = true;
ans = 1;
}
}//init of dp
for( int i=1;i<n;i++ ){
for( int j=0;j<=sum;j++ ){
if( dp[i-1][j].Choosed==false ){
if( j>=cost[i] ){
if( dp[i-1][j-cost[i]].maxVal+1>=dp[i-1][j].maxVal ){
dp[i][j].maxVal = dp[i-1][j-cost[i]].maxVal+1;
dp[i][j].len = 1;
dp[i][j].Choosed = true;
}
else {
if( dp[i-1][j].maxVal>dp[i][j].maxVal ){
dp[i][j].maxVal = dp[i-1][j].maxVal;
dp[i][j].len = 0;
dp[i][j].Choosed = false;
}
}
}
else {
if( dp[i-1][j].maxVal>dp[i][j].maxVal ){
dp[i][j].maxVal = dp[i-1][j].maxVal;
dp[i][j].len = 0;
dp[i][j].Choosed = false;
}
}
}
else{
if( j>=cost[i] ){
if( dp[i-1][j-cost[i]].maxVal-dp[i-1][j-cost[i]].len*dp[i-1][j-cost[i]].len+(dp[i-1][j-cost[i]].len+1)*(dp[i-1][j-cost[i]].len+1)>=dp[i-1][j].maxVal ){
dp[i][j].maxVal = dp[i-1][j-cost[i]].maxVal-dp[i-1][j-cost[i]].len*dp[i-1][j-cost[i]].len+(dp[i-1][j-cost[i]].len+1)*(dp[i-1][j-cost[i]].len+1);
dp[i][j].len = dp[i-1][j-cost[i]].len+1;
dp[i][j].Choosed = true;
}
else{
if( dp[i-1][j].maxVal>dp[i][j].maxVal ){
dp[i][j].maxVal = dp[i-1][j].maxVal;
dp[i][j].len = 0;
dp[i][j].Choosed = false;
}
}
}
else{
if( dp[i-1][j].maxVal>dp[i][j].maxVal ){
dp[i][j].maxVal = dp[i-1][j].maxVal;
dp[i][j].len = 0;
dp[i][j].Choosed = false;
}
}
}
ans = max(ans,dp[i][j].maxVal);
//printf("dp[%d][%d].val = %d, len = %d, choose = %d \n",i,j,dp[i][j].maxVal,dp[i][j].len,dp[i][j].Choosed);
}
}
printf("%d\n",ans);
}
return 0;
}
Ac代码。。
dp[ i ][ j ] 通过 1 到 i-1 之间的dp[ k ][ ? ] ( 1<=k<i ) 来更新。
如果 dp[ i ][ j ]:取了第i个,则可能是被dp[ k ][ ? ]+ ??更新,反之则为dp[ i-1 ][ j ]
/*
DP
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<math.h>
using namespace std;
typedef long long int64;
//typedef __int64 int64;
typedef pair<int64,int64> PII;
#define MP(a,b) make_pair((a),(b))
const int maxn = 105;
const int inf = 0x7fffffff;
const double pi=acos(-1.0);
const double eps = 1e-8;
int dp[ maxn ][ maxn ];
int a[ maxn ];
int main(){
int T;
scanf("%d",&T);
while( T-- ){
int n,sum;
scanf("%d%d",&n,&sum);
int MinCost = inf;
for( int i=1;i<=n;i++ ){
scanf("%d",&a[i]);
if( a[i]<MinCost ) MinCost = a[i];
}
if( MinCost>sum ){
printf("0\n");
continue;
}
if( MinCost==sum ){
puts("1");
continue;
}
int ans = 0;
memset( dp,0,sizeof( dp ) );
for( int i=1;i<=n;i++ ){
for( int j=0;j<=sum;j++ ){
int cnt = 0;
for( int k=1;k<=i;k++ ){
cnt += a[ i+1-k ];
if( cnt>j ) break;
dp[i][j] = max( dp[i][j],dp[i-k][j-cnt]+k*k );
}
dp[i][j] = max( dp[i][j],dp[i-1][j] );
ans = max( ans,dp[i][j] );
}
}
printf("%d\n",ans);
}
return 0;
}
分享到:
相关推荐
4. **动态规划(DP)**:动态规划是一种解决问题的系统方法,常用于优化问题,通过将大问题分解为小问题并存储中间结果来避免重复计算。在编程竞赛中,动态规划常用于解决背包问题、最长公共子序列、最短路径等问题...
【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,...
HDU上DP大集合,里面包括题,题解,代码,对DP入门者很实用,对DP老手也是有很大的提高
DP(Dynamic Programming,动态规划)是一种非常重要的算法思想,在 ACM HDU 题目分类中,DP 问题占据了很大的比例。例如,1003 DP 经典问题,最大连续子段和;1024 经典 DP,最大 M 子段和;1025 经典 DP,最长递增...
标题中的“DP.rar”表明这是一个关于动态规划的资料压缩包,而“DP_hdu”暗示了这些题目可能来自杭州电子科技大学(HDU)的在线编程平台。动态规划通常用于解决那些可以通过子问题的最优解来构建原问题最优解的问题...
题目名为“hdu 1257 最低拦截系统”,这里的“最低拦截系统”实际上是描述了一个问题场景,而具体的问题通过描述部分可以得知是要求找出给定数组中的最长递增子序列的长度。这里所谓的“最低拦截系统”可能是为了...
hdu 1005.比较简单的一道题,有兴趣的可以看看。
hdu 3341(ac自动机+状态压缩) 题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A、T、C、G其中...
在HDU OJ中,DP题目如1003、1024等,通常需要选手对状态进行定义,并找出状态转移方程,从而求得问题的最优解。这类题目考验的是选手对复杂问题的抽象能力和优化策略的运用。 ### 搜索 搜索算法是解决问题的一种...
* 题目1044:Collect More Jewels,涉及到动态规划(DP)的概念。 3. 图的搜索:图的搜索算法、图的路径查找等。 * 题目1067:Gap,涉及到图的搜索算法。 * 题目1072:Nightmare,涉及到完全搜索的概念。 4. 图的...
lazycal的集训队报告:初探数位DP 以HDU 2089,HDU 3652, URAL 1057等题目为例,介绍了数位DP的算法
dp的简单应用,状态转移方程dp[i][j] = max(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]) + p[i][j];注意开始点和终止点的判断
HDU-ACM课件.rar 是一个专门为编程竞赛爱好者准备的资源包,主要涵盖了ACM(国际大学生程序设计竞赛)中常见的算法知识。这个压缩包包含了一系列与算法相关的主题,旨在帮助初学者理解和掌握基础及进阶算法。下面将...
### DP的单调队列优化详解 #### 一、单调队列简介 单调队列是一种特殊的数据结构,主要用于处理滑动窗口中的最值问题。在算法竞赛中,尤其是在DP(动态规划)问题中,通过利用单调队列可以有效地优化时间复杂度。 ...
本篇文章主要关注几道典型的博弈题目:hdu2516、poj1067以及hdu1527、hdu2177和hdu2176等。这些题目均涉及到一种特别的局势——**奇异局势**。 ##### 奇异局势定义 - **定义**:在某些博弈问题中,存在一种特殊的...
OJ动态规划DP题目列表 POJ SOJ HDU 动态规划题目
【标题】"HDU杭电ACM课件完整打包"是一个专门为ACM竞赛初学者准备的资源集合,其中包含了杭州电子科技大学(HDU)的ACM竞赛相关课程资料。这个压缩包提供了丰富的学习材料,旨在帮助新手快速入门并提升算法和编程...
根据给定的信息,我们可以将杭电OJ(HDU Online Judge)中的题目按照不同类别进行归纳整理。这里涉及到了多种算法和技术,包括但不限于动态规划、图论、数据结构等。下面我们将对这些知识点进行详细说明。 ### 动态...