Cod sursa(job #1446197)

Utilizator stropitoare98stropitoare stropitoare98 Data 31 mai 2015 23:49:06
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <string.h>
#define INF 2100000000000
#define dim 102
using namespace std;
ifstream fin("zmeu.in");
ofstream fout("zmeu.out");
int C[dim][dim],P[dim][dim],n,p,i,j,l,k,t;
unsigned int dp[2][dim][1002],Min;
int main()
{
    fin>>n>>p;
    Min=1ll*INF;
    for(i=0;i<=1;i++)
        for(j=0;j<=n;j++)
            for(t=0;t<=p;t++)
                dp[i][j][t]=INF;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            fin>>P[i][j];
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            fin>>C[i][j];
    for(i=1;i<=n;i++)
        dp[0][i][0]=0;
    dp[!l][1][0]=C[1][1];
    dp[!l][1][P[1][1]]=0;
    for(t=1;t<=n;t++)
    {
        l=!l;
        for(j=1;j<=n;j++)
        {
            for(k=0;k<=p;k++)
            {
                if(dp[!l][j][k]!=INF&&t>1)
                {
                    dp[l][j][k]=min(dp[l][j][k],dp[!l][j][k]+C[t][j]);
                    dp[l][j][k+P[t][j]]=min(dp[l][j][k+P[t][j]],dp[!l][j][k]);
                }
                if(dp[l][j-1][k]!=INF&&j>1)
                {
                    dp[l][j][k]=min(dp[l][j][k],dp[l][j-1][k]+C[t][j]);
                    dp[l][j][k+P[t][j]]=min(dp[l][j-1][k],dp[l][j][k+P[t][j]]);
                }
                dp[!l][j][k]=INF;
            }
        }
    }
    for(i=0;i<=p;i++)
        if(Min>dp[l][n][i])
            Min=dp[l][n][i];
    fout<<Min;
    return 0;
}