1. 程式人生 > >hdu 1176——免費餡餅

hdu 1176——免費餡餅

最開始的時候從前向後算的,寫的很麻煩,而且一直沒找到錯誤在哪。。
從後往前算很容易
程式碼如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int dp[11][100005];

int main()
{
//    freopen("data.txt","r",stdin);
    int n;
    while(scanf("%d",&n)&&n){
        memset
(dp,0,sizeof(dp)); int tmax=0; for(int i=0;i<n;++i){ int a,b; scanf("%d%d",&a,&b); dp[a][b]++; tmax=max(tmax,b); } for(int i=tmax;i>=0;--i){ for(int j=0;j<=10;++j){ int l=max(j-1,0); int
r=min(j+1,10); int tmp=0; for(int k=l;k<=r;++k){ tmp=max(tmp,dp[k][i+1]); } dp[j][i]=dp[j][i]+tmp; } } printf("%d\n",dp[5][0]); } return 0; }

從前往後算的程式碼還沒有找到錯在哪,先放在這裡

#include<iostream>
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Cake { int T; int x; bool operator < (const Cake &a) const{ if(T==a.T)return x<a.x; return T< a.T; } }; int dp[15][100005]; Cake cake[100005]; int rec[100005]; int main() { // freopen("data.txt","r",stdin); int n; while(scanf("%d",&n)!=EOF&&n){ cake[0].T=0; cake[0].x=5; rec[0]=0; for(int i=1;i<=n;){ int a,b; scanf("%d%d",&a,&b); if(a>10||a<0){ n--; continue; } cake[i].x=a; cake[i].T=b; rec[i]=cake[i].T; i++; } sort(cake+1,cake+n+1); sort(rec+1,rec+n+1); int tot=unique(rec,rec+n+1)-rec; memset(dp,-1,sizeof(dp)); dp[5][0]=0; int t=0; int ans=0; for(int i=1;i<=n;++i){ int step=0; if(cake[i].T>cake[i-1].T){ t++; for(int j=0;j<=10;++j){ dp[j][t]=dp[j][t-1]; } } int pos=cake[i].x; if(cake[i].T==cake[i-1].T&&cake[i].x==cake[i-1].x&&dp[pos][t]!=-1){ dp[pos][t]++; ans=max(ans,dp[pos][t]); continue; } step=rec[t]; for(int j=max(0,5-step);j<=min(10,5+step);++j){ dp[j][t]=max(0,dp[j][t]); } step=rec[t]-rec[t-1]; int l=max(pos-step,0); int r=min(pos+step,10); for(int j=l;j<=r;++j){ if(dp[j][t-1]==-1)continue; dp[pos][t]=max(dp[pos][t],dp[j][t-1]+1); } ans=max(ans,dp[pos][t]); } if(t!=tot-1)tot=1/0; printf("%d\n",ans); } return 0; }