hdu 4939 Stupid Tower Defense 2014 Multi-University Training Contest 7
2014-11-29 11:58
513 查看
贪心+DP,真是好巧妙啊,蒟蒻如何能想得出来TAT
因为red tower只对当前点有影响,所以应该放在最后。
dp[i][j]表示前i个Tower里有j个blue Tower,所以由point i是blue or green可以分成两种case
dp[i][j]=max((dp[i-1][j-1]+(i-j)*y*(t+(j-1)*z)),dp[i-1][j]+(i-j-1)*y*(t+j*z))
(i-j)*y*(t+(j-1)*z)表示前面i-j个green对point i的影响,(i-j-1)*y*(t+j*z)表示前面i-j-1个green对point i的影响.
damage=dp[i][j]+(n-i)*x*(t+j*z)+(n-i)*(i-j)*y*(t+j*z); (n-i)*x*(t+j*z)表示后n-i个red的影响,(n-i)*(i-j)*y*(t+j*z)表示前面的green对后n-i个point的影响
ans=max(ans,damage);
注意dp的时候i从1枚举,没有考虑全是red的情况,所以该case要特判。
WA了好久== 因为之前对状态没有考虑全,木有对每个disjoint condition都想清楚。比如dp[i][0],dp[i][i]这种。
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include <ctype.h>
#include<map>
#include<time.h>
using namespace std;
//hdu 4939
const int maxn=1510;
int T;
long long n;
long long x;
long long y;
long long z;
long long t;
long long dp[maxn][maxn];
long long ans;
void DP()
{
memset(dp,0,sizeof(dp));
ans=n*t*x;//因为i是从1开始枚举的,没有包括全是red的情形,所以要特判。
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0]+(i-1)*y*t;
for(int j=1;j<i;j++)
{
dp[i][j]=max((dp[i-1][j-1]+(i-j)*y*(t+(j-1)*z)),dp[i-1][j]+(i-j-1)*y*(t+j*z));
}
dp[i][i]=dp[i-1][i-1];
}
long long damage=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
damage=dp[i][j]+(n-i)*x*(t+j*z)+(n-i)*(i-j)*y*(t+j*z);
ans=max(ans,damage);
}
}
}
int main()
{
freopen("input.txt","r",stdin);
// freopen("data.txt","r",stdin);
// freopen("out1.txt","w",stdout);
scanf("%d",&T);
for(int ca=1;ca<=T;ca++)
{
scanf("%I64d %I64d %I64d %I64d %I64d",&n,&x,&y,&z,&t);
if(n==1)
{
ans=t*x;
}
else
{
DP();
}
printf("Case #%d: %I64d\n",ca,ans);
}
return 0;
}
因为red tower只对当前点有影响,所以应该放在最后。
dp[i][j]表示前i个Tower里有j个blue Tower,所以由point i是blue or green可以分成两种case
dp[i][j]=max((dp[i-1][j-1]+(i-j)*y*(t+(j-1)*z)),dp[i-1][j]+(i-j-1)*y*(t+j*z))
(i-j)*y*(t+(j-1)*z)表示前面i-j个green对point i的影响,(i-j-1)*y*(t+j*z)表示前面i-j-1个green对point i的影响.
damage=dp[i][j]+(n-i)*x*(t+j*z)+(n-i)*(i-j)*y*(t+j*z); (n-i)*x*(t+j*z)表示后n-i个red的影响,(n-i)*(i-j)*y*(t+j*z)表示前面的green对后n-i个point的影响
ans=max(ans,damage);
注意dp的时候i从1枚举,没有考虑全是red的情况,所以该case要特判。
WA了好久== 因为之前对状态没有考虑全,木有对每个disjoint condition都想清楚。比如dp[i][0],dp[i][i]这种。
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include <ctype.h>
#include<map>
#include<time.h>
using namespace std;
//hdu 4939
const int maxn=1510;
int T;
long long n;
long long x;
long long y;
long long z;
long long t;
long long dp[maxn][maxn];
long long ans;
void DP()
{
memset(dp,0,sizeof(dp));
ans=n*t*x;//因为i是从1开始枚举的,没有包括全是red的情形,所以要特判。
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0]+(i-1)*y*t;
for(int j=1;j<i;j++)
{
dp[i][j]=max((dp[i-1][j-1]+(i-j)*y*(t+(j-1)*z)),dp[i-1][j]+(i-j-1)*y*(t+j*z));
}
dp[i][i]=dp[i-1][i-1];
}
long long damage=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
damage=dp[i][j]+(n-i)*x*(t+j*z)+(n-i)*(i-j)*y*(t+j*z);
ans=max(ans,damage);
}
}
}
int main()
{
freopen("input.txt","r",stdin);
// freopen("data.txt","r",stdin);
// freopen("out1.txt","w",stdout);
scanf("%d",&T);
for(int ca=1;ca<=T;ca++)
{
scanf("%I64d %I64d %I64d %I64d %I64d",&n,&x,&y,&z,&t);
if(n==1)
{
ans=t*x;
}
else
{
DP();
}
printf("Case #%d: %I64d\n",ca,ans);
}
return 0;
}
相关文章推荐
- HDU 4939 Stupid Tower Defense (2014 Multi-University Training Contest 7)
- hdu 4939 Stupid Tower Defens2014 Multi-University Training Contest 7
- hdu 4939 2014 Multi-University Training Contest 7 1005
- hdu 4937 Lucky Number 2014 Multi-University Training Contest 7
- hdu 4941 Magical Forest--2014 Multi-University Training Contest 7
- 【2014 Multi-University Training Contest 3 1007】/【HDU 4893】 Wow! Such Sequence!
- hdu 4893 Wow! Such Sequence! 2014 Multi-University Training Contest 3
- hdu 4968 Improving the GPA--2014 Multi-University Training Contest 9
- hdu 4970 Killing Monsters(2014 Multi-University Training Contest 9)
- hdu 4925 Apple Tree 2014 Multi-University Training Contest 6
- 【2014 Multi-University Training Contest 2 1002】/【HDU 4873】 ZCC Loves Intersection
- hdu 4915 Parenthese sequence--2014 Multi-University Training Contest 5
- hdu 4911 Inversion ( 2014 Multi-University Training Contest 5)
- hdu 4923 Room and Moor--2014 Multi-University Training Contest 6
- HDU 4870 Rating 2014 Multi-University Training Contest 1 J题 概率DP+高斯消元
- 【2014 Multi-University Training Contest 2 1002】/【HDU 4873】 ZCC Loves Intersection
- 【hdu 4970】 Killing Monsters 【2014 Multi-University Training Contest 9 】
- hdu 4876 ZCC loves cards 2014 Multi-University Training Contest 2
- hdu 4941 2014 Multi-University Training Contest 7 1007
- hdu 4961 Boring Sum--2014 Multi-University Training Contest 9