这道题显示出来一个dp很重要的东西,就是如何确定要几维dp
我以为要三维,英雄血,英雄魔,boss血,然后被困死在如何确定失败上,实际上二维就已经足够算出三维的信息。
我的(仍未修改):
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,t,q;
int skill1[1000];
int skill2[1000];
int d[105][105][105];
int dp(int i,int j,int k)
{
if(k<=0) return 0;
if(i<=0) return 999999;
if(d[i][j][k])return d[i][j][k];
int x;
d[i][j][k]=9999999;
for(x=0;x<n;x++)
{
if(skill1[x]<=j)
{
if(i-q+t<=100)
d[i][j][k]=min(d[i][j][k],dp(i-q+t,j-skill1[x],k-skill2[x])+1);
else
d[i][j][k]=min(d[i][j][k],dp(100,j-skill1[x],k-skill2[x])+1);
}
}
if(i-q+t<=100)
d[i][j][k]=min(d[i][j][k],dp(i-q+t,j,k-1)+1);
else
d[i][j][k]=min(d[i][j][k],dp(100,j,k-1)+1);
return d[i][j][k];
}
using namespace std;
int main() {
while(scanf("%d %d %d",&n,&t,&q)==3&&!(n==0&&t==0&&q==0))
{
int i;
for(i=0;i<n;i++)
{
scanf("%d %d",&skill1[i],&skill2[i]);
}
memset(d,0,sizeof(d));
int ans=dp(100,100,100);
if(ans<0) printf("My god\n");
else printf("%d\n",ans);
}
return 0;
}
对的:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 105; int a[N], b[N], d[N][N]; int main() { int n, t, q, ans, ti; while (scanf ("%d%d%d", &n, &t, &q), n) { ++n; ti = (100 % q) ? (100 / q + 1) : (100 / q); a[1] = 0, b[1] = 1; for (int i = 2; i <= n; ++i) scanf ("%d%d", &a[i], &b[i]); memset (d, 0x3f, sizeof (d)); d[0][100] = 100; ans = 0; for (int i = 1; i <= ti; ++i) for (int m = 0; m <= 100; ++m) { int j = min (100, m + t); for (int k = 1; k <= n; ++k) if (m + a[k] <= 100) d[i][j] = min (d[i][j], d[i - 1][m + a[k]] - b[k]); if (d[i][j] <= 0) { ans = i, i = ti; break; } } if (ans == 0) printf ("My god\n"); else printf ("%d\n", ans); } return 0; }