wa掉了掉了。。。。
看了好久的题解。。。。。怎么办我比较笨。。。。跑了四百wa掉了。
题解说是贪心+DP。感觉自己领悟不够。。。
预处理这一块主要是找到可能存在的尽可能多的血量的情况。
然后DP这里主要是考虑这一次补不补刀。DP[i][j]表示在第i回合补了j刀的最大得分。然后其实这里自己想的不是很清楚。再想想……
***************************
好吧,,,过了几天再想想就会清楚一点了。。。
好不容易A掉了。发现初始化0和-1会特别有差别!!注意初始化。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 1010
int blood[maxn],dp[maxn][maxn];
int cost[maxn];
int main()
{
int t,cas=0;
scanf("%d",&t);
while(t--)
{
int n,a;
int big,ans;
big=ans=-1;
scanf("%d",&n);
memset(blood,0,sizeof(blood));
memset(dp,-1,sizeof(dp));
memset(cost,0,sizeof(cost));
for(int i=0;i<n;i++)
{ scanf("%d",&a);
blood[i]=a;
big=max(big,a);
}
sort(blood,blood+n);
for(int i=0;i<n;i++)
{
int b=blood[i];
int tmp=1;
while(cost[b]&&b>=1)
{
b--;
tmp++;
}
if(b>0) cost[b]=tmp;
}
// for(int i=1;i<=big;i++) printf("***%d",cost[i]); printf("\n");
dp[0][0]=0;
for(int i=1;i<=big;i++)
{
for(int j=0;j<=i+1;j++)
{
if(j-1>=0) dp[i][j]=max(dp[i][j],dp[i-1][j-1]);
if(cost[i]&&j+cost[i]-1<=i)
{
dp[i][j]=max(dp[i][j],dp[i-1][j+cost[i]-1]+1);
}
// ans=max(ans,dp[i][j]);
}
}
for(int i=0;i<=big;i++) ans=max(ans,dp[big][i]);
printf("Case #%d: %d\n",++cas,ans);
}
return 0;
}