刚开始我还以为这道题目非常的简单。。
然后随便打了一个DP,直接WA,被zxyer狠狠地D了一顿。
然后发现有好多细节。。
首先假如某横坐标没有管子,那么l[x]=0;h[x]=m+1;
然后DP的时候往上是完全背包,往下是01背包。
由于不能接触到管子,所以0~l[x]和h[x]~m要设值inf方便下面判断。
m-max(q)*x[i]~m也要特判,因为有限高。。
最后统计答案也是很醉、。、
下面贴代码。。
#include#include #include #include #include #define inf ((1<<31)-2) using namespace std; int f[10001][1001]; int n,m,k,ans; int x[10001],y[10001]; int l[10001],h[10001]; int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=0;i =x[i-1]) { f[i][j]=min(f[i][j],f[i-1][j-x[i-1]]+1); f[i][j]=min(f[i][j],f[i][j-x[i-1]]+1); } if(j==m) { for(int k=j-x[i-1];k<=m;k++) { f[i][j]=min(f[i][j],f[i-1][k]+1); f[i][j]=min(f[i][j],f[i][k]+1); } } } for(int j=l[i]+1;j =1;i--) { for(int j=l[i]+1;j