ACM-学习记录-DP-1
DPL_1_A: Coin Changing Problem
每次均有两种选择,即选择当前的,即为在当前状态+1,否则维持原来的T[j+d[i]]
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
const int INF=(1<<29);
int main()
{
int n,m;
int d[20+5];
int T[50000 + 5];
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>d[i];
for(int i=0;i<50000+5;i++)
{
T[i]=INF;
}
T[0]=0;
//for(int i=0;i<=50000+5;i++) cout<<T[i]<<endl;
for(int i=1;i<=m;i++)
{
for(int j=0;j+d[i]<=n;j++)
{
T[j + d[i]] = min(T[j+d[i]], T[j]+1);
}
}
cout<<T[n]<<endl;
return 0;
}
DPL_1_B: 0-1 Knapsack Problem
#include<iostream>
#include<vector>
#include<algorithm>
#define NMAX 105
#define WMAX 10005
using namespace std;
struct Item{
int value;
int weight;
};
int N,W;
Item items[NMAX];
int C[NMAX][WMAX], G[NMAX][WMAX];
void compute(int &maxValue, vector<int> &selection)
{
for(int w=0;w<=W;w++)
{
C[0][w]=0;
G[0][w]=1;
}
for(int i=1;i<=N;i++)
C[i][0]=0;
for(int i=1;i<=N;i++)
{
for(int w=1;w<=W;w++)
{
C[i][w]=C[i-1][w];
G[i][w]=0;
if(items[i].weight>w) continue;
if(items[i].value + C[i-1][w-items[i].weight]>C[i-1][w])
{
C[i][w]=items[i].value + C[i-1][w-items[i].weight];
G[i][w]=1;
}
}
}
maxValue=C[N][W];
selection.clear();
for(int i=N,w=W;i>=1;i--)
{
if(G[i][w]==1)
{
selection.push_back(i);
w-=items[i].weight;
}
}
reverse(selection.begin(), selection.end());
}
int main()
{
int maxValue;
vector<int> selection;
cin>>N>>W;
for(int i=1;i<=N;i++)
{
cin>>items[i].value>>items[i].weight;
}
compute(maxValue, selection);
cout<<maxValue<<endl;
return 0;
}
NEFUOJ P21 最长上升子序列
#include<iostream>
#include<algorithm>
#define MAX 100000
using namespace std;
int n,A[MAX+1],L[MAX];
int lis()
{
L[0]=A[0];
int length=1;
for(int i=1;i<n;i++)
{
if(L[length-1]<A[i])
{
L[length++]=A[i];
}
else
*lower_bound(L, L+length, A[i])=A[i];
}
return length;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>A[i];
}
cout<<lis()<<endl;
return 0;
}
DPL_3_A: Largest Square
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
#define MAX 1400
int dp[MAX][MAX], G[MAX][MAX];
int getS(int H,int W)
{
int maxWidth = 0;
for(int i=0;i<H;i++)
{
for(int j=0;j<W;j++)
{
dp[i][j]=(G[i][j]+1)%2;
maxWidth |= dp[i][j];
}
}
for(int i=1;i<H;i++)
{
for(int j=1;j<W;j++)
{
if(G[i][j])
{
dp[i][j]=0;
}
else
{
dp[i][j]=min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;
maxWidth=max(maxWidth, dp[i][j]);
}
}
}
return maxWidth * maxWidth;
}
int main()
{
int H,W;
cin>>H>>W;
for(int i=0;i<H;i++)
for(int j=0;j<W;j++)
cin>>G[i][j];
cout<<getS(H,W)<<endl;
return 0;
}
空谈误国,实干兴邦
个人博客: https://www.0error.net/