状态转移很有新鲜感, 我没想到, 难道是我变弱了?
n>1时, dp[n][e][d]=min{ dp[n-1][e-p][d-p] }
n==1时, dp[1][e][d]=min{ dp[1][e-p^2][d-p] }
速度可以分段, 和路程的关系比较纠结, 列个方程算不出来 = =
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int orz(int dp[21][101][101],int n,int e,int d) {
if(dp[n][e][d]!=-1)
return dp[n][e][d];
if(e<d)
return 2e9;
if(d==0)
return 0;
if(e==0)
return 2e9;
dp[n][e][d]=2e9;
switch(n) {
case 1:
for(int p=1;p<=(int)sqrt((double)e);p++)
dp[n][e][d]=min(orz(dp,n,e-p*p,d-p)+1,dp[n][e][d]);
break;
default:
for(int p=1;p<=d;p++)
dp[n][e][d]=min(dp[n][e][d],orz(dp,n-1,e-p,d-p)+orz(dp,1,e,p));
break;
}
return dp[n][e][d];
}
int main() {
int N,E,D;
scanf("%d%d%d",&N,&E,&D);
int dp[21][101][101];
memset(dp,0xff,sizeof(dp));
printf("%d",orz(dp,N,E,D));
return 0;
}